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

Python十进制转十六进制再转字节报错求助:TypeError问题

解决十进制转字节的报错问题

我来帮你理清这个问题的根源,以及给出简单的解决方案:

问题出在哪?

你之前的错误在于,hex(equipmentID)返回的是十六进制格式的字符串(比如十进制5会得到"0x5"),而bytes()函数如果传入字符串参数,必须指定编码(比如utf-8)——这也是你看到TypeError: string argument without an encoding的原因。更关键的是,就算你加了编码,得到的也不是你想要的字节值(比如bytes("0x5", encoding='utf-8')会得到b'0x5',这是文本字节,不是数值对应的字节)。

正确的转换方法

其实你完全不需要先转成十六进制字符串,直接把十进制整数转成字节就可以了,有两种常用方式:

1. 单字节数值(0-255)直接用bytes([整数])

这和你手动写bytes([0x5])是一个逻辑,因为0x5本身就是十进制5的十六进制写法,本质都是整数:

equipmentID = 5
# 直接将十进制整数转为对应的字节
equipmentID_bytes = bytes([equipmentID])
print(equipmentID_bytes)  # 输出: b'\x05'

2. 多字节数值(超过255)用int.to_bytes()方法

如果你的设备ID是更大的数,需要占用多个字节,可以用整数的to_bytes()方法,指定字节数和字节序(大端/小端):

# 比如十进制258,对应十六进制0x0102
equipmentID = 258
# 转成2字节,大端序(高位字节在前)
equipmentID_bytes_big = equipmentID.to_bytes(2, byteorder='big')
print(equipmentID_bytes_big)  # 输出: b'\x01\x02'

# 转成2字节,小端序(低位字节在前)
equipmentID_bytes_little = equipmentID.to_bytes(2, byteorder='little')
print(equipmentID_bytes_little)  # 输出: b'\x02\x01'

额外说明

如果非要从十六进制字符串转字节(比如你已经有了"0x5"这样的字符串),可以先把它转回整数,再转字节:

hex_str = "0x5"
# 去掉前缀转整数,或者直接用int(hex_str, 16)
dec_num = int(hex_str.lstrip('0x'), 16)
equipmentID_bytes = bytes([dec_num])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:17:07