Zebra 라고 하는 유명한 Label Printer 업체가 있음.
Label Printer를 이용하려면 일반 파일은 출력이 안 되고 ZPL이라고 하는 Zebra 자체 코드로 작성된 명령문을 이용해야 함.
ZPL(Zebra Programming Language)에 대한 설명은 아래 참고.
https://www.zebra.com/content/dam/zebra/manuals/printers/common/programming/zpl-zbi2-pm-en.pdf
이 중에서 이미지 파일을 출력하게 하는 경우는 ~DG 라는 명령어를 사용하여 그림파일을 Label Printer에 다운로드하고 사용하는 방식도 있지만 ZPL 형식으로 그림파일이 압축되어 있는 경우도 있음.
우리 회사의 Label Data Base에는 Label에 들어가는 이미지가 모두 ZPL 압축형식이었어서 이를 해석하는 방법이 필요했음.
예컨데, ^GF 명령어를 쓰게 되면 다음과 같이 나오게 됨.
^GFa,b,c,d,data
a = 압축방식, b = 이미지의 전체 바이트 수, c = 이미지의 총 칸 수(1bpp = 1Bit Per Pixel)의 경우 비트 수와 동일, d = bytes per row = 1 행에 몇 byte의 데이터가 있는지, data = 이미지 데이터
무슨소리냐면,
^GFB,8000,8000,80,Binary data
--> 압축방식은 B(Binary) 이고, 이미지 전체 바이트 수는 8000 바이트, 이며 이미지의 총 칸 수는 8000개이고, 한 줄에는 80 Bytes 씩 데이터가 있음(= 총 100줄이라는 뜻)
이라는 뜻임.
그런데... 문제는 Data가 압축이 되어 있다는 것임.
분명히 Hex(16진수)로 데이터가 되어 있으면 0~9, A~F 까지 총 16개의 글자만 쓸 수 있어야 하는데,
소문자는 물론 G, K, Z 심지어는 ! , : 등의 기호도 나옴.
Zebra 홈페이지에서 내용을 찾기가 어려워서 구글링한 끝에 외국 형님들의 꿀정보를 발견.
https://stackoverflow.com/questions/68627676/c-sharp-zebra-hex-compress-algorithm
C# Zebra hex compress algorithm
I am currently working on a project communicating with Zebra printers. I already have a way to compress the hex data (The Method EncodeHexAscii compress the data). But I can't find a way to decompr...
stackoverflow.com
알고보니 기존 Hex(0~9, A~F)는 그대로 쓰고 Hex 앞의 글자는 Hex가 몇번 반복되느냐였던 것이었음.
말이 어려운데 예시를 보자면 다음과 같음.
K4 => 4444 (4가 4번 반복됨)
M5 => 5555555 (5가 7번 반복됨)
: => 앞줄 그대로 반복
, => 이후로 한 줄을 0으로 채움
! => 이후로 한 줄을 1로 채움
정말 개떡같은 압축인데, 한정적인 통신속도, 메모리 용량을 생각하면 어쩔 수 없는 방식이기도 할 것 같음.
참고, 위의 stack over flow 코드에 오류가 조금 있어서 수정이 필요함.