Python通过UDP Socket发送十六进制数值列表报错TypeError如何解决
问题原因
你遇到的类型报错核心有两个可能的诱因:
- 你的
frames_to_send列表中混入了bytes类型的元素(比如误将单字节值写为b'\x00'而非整数0x00),在构造bytearray时会触发该类型错误 - Python 3的UDP socket
sendto方法原生要求第一个入参为bytes类型,部分版本的socket实现不支持直接传入bytearray可变二进制序列
正确实现方案
方案1:直接构造bytes对象(兼容性最高,适配所有Python 3版本)
frames_to_send = [0x00, 0x01, 0x02, 0x03, 0x05] # 可选校验:确保所有元素都是0-255范围内的合法单字节整数 for val in frames_to_send: if not isinstance(val, int) or val < 0 or val > 255: raise ValueError(f"非法值 {val}:必须为0-255区间的整数") # 转换为bytes类型后发送 UDPServerSocket.sendto(bytes(frames_to_send), ("127.0.0.1", 5555))
方案2:需修改二进制内容时使用bytearray
如果发送前需要对二进制内容做增删改操作,可以先构造bytearray操作完成后再转bytes发送:
frames_to_send = [0x00, 0x01, 0x02, 0x03, 0x05] frame_buf = bytearray(frames_to_send) # 示例:修改第三个字节的数值 frame_buf[2] = 0xff # 转成bytes后发送 UDPServerSocket.sendto(bytes(frame_buf), ("127.0.0.1", 5555))
接收端适配说明
C语言接收端可直接按char数组读取收到的报文,内容和你定义的十六进制列表顺序完全一致,单字节序列不存在字节序转换问题,和你之前发送字符串的接收逻辑完全兼容,无需额外修改接收端代码。
内容的提问来源于stack exchange,提问作者deepan muthusamy
相关产品推荐
相关产品推荐

