thermal-printer/reverse_engineering/decode.py

87 lines
2.4 KiB
Python

import os
from PIL import Image
import sys
import glob
os.makedirs("decodedImg", exist_ok=True)
for in_file in glob.glob("data/data*.txt"):
cmds = []
with open(in_file, "r") as file:
data = file.read().split('\n')
data = [d.strip() for d in data if len(d)>0]
binary = []
for d in data:
binary.extend(bytes.fromhex(d))
idx = -1
data = []
cmdCode = 0x00
dataLen = 0
crc = 0x00
for i, b in enumerate(binary):
idx += 1
#print(i, idx, hex(b))
if b == 0x51 and idx == 0:
pass
elif b == 0x78 and idx == 1:
pass
elif idx == 2:
cmdCode = b
elif b == 0x00 and idx == 3:
pass
elif idx == 4:
dataLen = b
elif idx == 5:
if b != 0:
dataLen = dataLen*0x100 + b
elif idx >= 6 and idx < 6+dataLen:
data.append(b)
elif idx == 6+dataLen:
crc = b
elif idx == 6+dataLen+1 and b == 0xFF:
o = {
"cmd": cmdCode,
"data": data,
"crc": crc
}
cmds.append(o)
idx = -1
crc = 0
data = []
cmdCode = 0
else:
idx = -1
crc = 0
data = []
cmdCode = 0
#print(cmds)
#for c in cmds:
# print(hex(c["cmd"]), hex(len(c["data"])), hex(c["crc"]))
rows = []
for c in cmds:
if c["cmd"] == 0xa2:
s = "".join([bin(b)[2:10].zfill(8)[::-1] for b in c["data"]])
row = [int(x)==1 for x in s]
rows.append(row)
elif c["cmd"] == 0xbf:
row = []
for b in c["data"]:
bit = (b & (1<<7)) == 128
times = b & ~(1<<7)
row.extend([bit] * times)
rows.append(row)
HEIGHT = len(rows)
WIDTH = max(len(r) for r in rows)
img = Image.new("1", (WIDTH, HEIGHT))
for y in range(HEIGHT):
for x in range(WIDTH):
img.putpixel((x,y), not rows[y][x])
base = in_file.split('\\')[-1].split('.')[0] # Get base name without extension
output_file = f"decodedImg/{base}.png"
img.save(output_file)