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

Python 3.8:将8字节序列转换为4个十六进制值的列表

解决方案

你的核心问题是没搞清楚:输入的b'12345678'里每个字节是字符的ASCII码值(比如b'1'对应49,即0x31),但你需要的是把两个字符当成十六进制的两位数字来组合。直接操作字节的ASCII值肯定得不到正确结果,正确的处理步骤如下:

实现代码

def ConvertToHexAndSend(serialnumber):
    # 将bytes转成ASCII字符串(输入是固定长度8的字符bytes,解码不会出错)
    str_serial = serialnumber.decode('ascii')
    # 每两个字符分割成一组
    hex_groups = [str_serial[i:i+2] for i in range(0, 8, 2)]
    # 把每组字符串转成十六进制整数
    return [int(group, 16) for group in hex_groups]

测试验证

serialnumber = b'12345678'
print(ConvertToHexAndSend(serialnumber))  # 输出 [18, 52, 86, 120]
# 注:Python中整数18和0x12是同一个值,只是显示形式不同,若要以十六进制格式查看,可这样打印:
print([hex(num) for num in ConvertToHexAndSend(serialnumber)])  # 输出 ['0x12', '0x34', '0x56', '0x78']

你的尝试为什么错了

  • list(serialnumber)得到的是每个字符的ASCII码值(比如b'1'对应49),你用new_list[0] << 8 + new_list[1]是对ASCII码值做位运算,完全和目标无关,自然得到异常值。
  • hex(serialnumber[0])返回的是ASCII码值的十六进制字符串(比如b'1'的ASCII是49,所以得到'0x31'),不是字符本身对应的十六进制数字。
  • serialnumber[0] + serialnumber[1]是把两个ASCII码值相加(49+50=99),同样和目标逻辑不沾边。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:45:56