Python实现CNG转JPEG:如何正确写入二进制字节而非ASCII?
解决CNG转JPEG时二进制字节写入错误的问题
问题根源
你当前代码的核心错误是:将计算后的数值转成了十六进制字符串,再把字符串的ASCII编码写入文件,而非直接写入数值对应的二进制字节。比如数值15(0x0f)被转成字符串'0x0f'或'0f',写入的是字符'0'、'x'、'f'的ASCII值(0x30、0x78、0x66),而非真正的二进制字节0x0f。
解决方案
直接将计算后的整数(0-255范围)添加到bytearray即可,不需要经过十六进制字符串转换。bytearray原生支持接收单个整数作为字节内容。
修改后的完整代码:
import os barray = bytearray() s = 'e0e1e2e3e4e5e6e7e8e9eaebecedeeef' i = 0 cnt = len(s) while i < cnt: # 取两位十六进制字符 hex_pair = s[i:i+2] # 转成整数 num = int(hex_pair, 16) # 异或操作 num = num ^ 239 # 直接将整数作为字节添加到bytearray barray.append(num) i += 2 print('barray = \n', barray) outpath = 'C:\\Users\\jeffe\\Programming\\Python\\' filename = 'hexformattest.jpeg' savefilename = os.path.join(outpath, filename) # os.path.join自动处理路径分隔符,无需手动加\ # 写入二进制文件 with open(savefilename, 'wb') as binaryfile: binaryfile.write(barray)
关键修改点说明
- 直接添加整数到bytearray:
barray.append(num)会将num(0-255)直接转成对应的单个二进制字节,这才是你需要写入文件的内容。 - 简化循环逻辑:用
i += 2替代原有的手动索引计算,代码更简洁易读。 - 优化路径拼接:
os.path.join自动处理不同系统的路径分隔符,避免手动拼接导致的路径错误。 - 使用with语句:自动管理文件句柄,无需手动调用
close(),代码更安全规范。
关于struct.pack()的替代用法
如果想用struct.pack()实现字节转换,可替换append部分为:
import struct # ... barray += struct.pack('B', num) # 'B'代表无符号单字节(范围0-255)
效果和append(num)完全一致,只是写法不同。
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

