我从网络接收一个包含许多字段的字节数组缓冲区。当我想打印缓冲区时,我收到以下错误:
(:ord()期望的长度为1的字符串,int 结果
print(" ".join("{:02X}".format(ord(c)) for c in buf))
我该如何解决这个问题?
答案 0 :(得分:5)
Python bytearray
和bytes
对象在迭代或索引时产生整数,而不是字符。删除ord()
电话:
print(" ".join("{:02X}".format(c) for c in buf))
虽然字节文字和表示基于ASCII文本,但字节对象实际上表现为不可变的整数序列,序列中的每个值都受到限制,以致
0 <= x < 256
(试图违反此限制将触发{{1}这是故意强调的,虽然许多二进制格式包括基于ASCII的元素,并且可以使用一些面向文本的算法进行有用的操作,但对于任意二进制数据通常不是这种情况(盲目地将文本处理算法应用于二进制数据格式,不兼容ASCII通常会导致数据损坏。)
并进一步:
由于字节对象是整数序列(类似于元组),对于字节对象 b ,
ValueError
将是一个整数,而b[0]
将是一个字节长度为1的对象。(这与文本字符串形成对比,其中索引和切片将生成长度为1的字符串)
我不会b[0:1]
使用format()
function所做的事情;没有更大的字符串可以将十六进制数字插入:
str.format()
对于print(" ".join([format(c, "02X") for c in buf]))
次来电,使用列表理解会稍快一些,因为str.join()
调用必须将可迭代转换为列表 ;它需要进行双重扫描才能构建输出。