You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

关键修改点说明

  1. 直接添加整数到bytearray:barray.append(num)会将num(0-255)直接转成对应的单个二进制字节,这才是你需要写入文件的内容。
  2. 简化循环逻辑:用i += 2替代原有的手动索引计算,代码更简洁易读。
  3. 优化路径拼接:os.path.join自动处理不同系统的路径分隔符,避免手动拼接导致的路径错误。
  4. 使用with语句:自动管理文件句柄,无需手动调用close(),代码更安全规范。

关于struct.pack()的替代用法

如果想用struct.pack()实现字节转换,可替换append部分为:

import struct
# ...
barray += struct.pack('B', num)  # 'B'代表无符号单字节(范围0-255)

效果和append(num)完全一致,只是写法不同。

内容的提问来源于stack exchange,提问作者Jeff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 19:12:35