Struct.error:' s'必须是已提供的字节对象

时间:2016-01-19 18:22:33

标签: python python-3.x exception struct

我一直在使用Python中的TCP / IP连接程序,并且需要使用Struct。所以我导入了模块,并在一段时间后出现了一个非常特殊的问题。当我运行下面的代码时,我得到了te标题中指定的错误,这应该在我检查了一些其他答案和文档后工作。

import struct

string = "blab"

s = struct.Struct(b'4s')
packed_data = s.pack(string)

print(packed_data)

据我所知,问题应该通过将s变量中使用的字符串加上' b'来解决。或使用bytes()函数解析' utf-8'作为编码参数。试过两个,同样的错误。

我不知道出了什么问题,所以我错过了什么?我在网上找不到有关此问题的相关信息,所以这就是我现在在这里发帖的原因。

任何帮助都表示赞赏,并提前致谢!

2 个答案:

答案 0 :(得分:3)

最小的问题是你把" b"在错误的地方。当你要打包的数据真正需要是一个字节字符串时,你放入了格式字符串。

>>> string = "blab"
>>> s = struct.Struct('4s')
>>> packed_data = s.pack(string.encode('utf-8'))
>>> print(packed_data)
b'blab'

但即便如此也是有问题的。假设你的字符串不在ascii字符集中......让我们说它的希腊语,那么utf8的enocded字符串超过4个字节并且你写了一个截断值

>>> string = "ΑΒΓΔ"
>>> s = struct.Struct('4s')
>>> 
>>> packed_data = s.pack(string.encode('utf-8'))
>>> print('utf8len', len(string.encode('utf-8')), 'packedlen', len(packed_data))
utf8len 8 packedlen 4
>>> print(packed_data)
b'\xce\x91\xce\x92'
>>> print(struct.unpack('4s', packed_data)[0].decode('utf-8'))
ΑΒ
>>> 

如果您确实需要限制为4个字节,请使用ascii而不是utf-8转换原始字符串,以便任何不可解码的unicode字符立即引发异常。

>>> string = "ΑΒΓΔ"
>>> s = struct.Struct('4s')
>>> 
>>> packed_data = s.pack(string.encode('ascii'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)

答案 1 :(得分:1)

packed_data = s.pack(string.encode('utf-8'))

应该同时适用于Py2和3

来自Unicode HowTo for Python 2.7.11:

  

另一个重要的方法是.encode([encoding],[errors ='strict']),   它返回编码的Unicode字符串的8位字符串版本   在请求的编码中。 errors参数与。相同   unicode()构造函数的参数,另外一个   可能性;以及'严格','忽略'和'替换',你可以   还传递'xmlcharrefreplace',它使用XML的字符引用。   以下示例显示了不同的结果:

https://docs.python.org/2/howto/unicode.html