ord()期望的长度为1的字符串,但是找到了int

时间:2015-05-06 12:06:26

标签: python bytearray

我从网络接收一个包含许多字段的字节数组缓冲区。当我想打印缓冲区时,我收到以下错误:

  

(:ord()期望的长度为1的字符串,int   结果

 print(" ".join("{:02X}".format(ord(c)) for c in buf))

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:5)

Python bytearraybytes对象在迭代或索引时产生整数,而不是字符。删除ord()电话:

print(" ".join("{:02X}".format(c) for c in buf))

来自Bytes documentation

  

虽然字节文字和表示基于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()调用必须将可迭代转换为列表 ;它需要进行双重扫描才能构建输出。