gpt4 book ai didi

python - Struct.error : argument for 's' must be a bytes object, 已经提供

转载 作者:太空宇宙 更新时间:2023-11-04 10:16:50 28 4
gpt4 key购买 nike

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

import struct

string = "blab"

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

print(packed_data)

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

我不知道哪里出了问题,所以我是不是遗漏了什么?我在网上找不到关于这个问题的相关信息,所以这就是我现在在这里发帖的原因。

感谢任何帮助,并提前致谢!

最佳答案

一个问题是您将“b”放在了错误的位置。当要打包的数据需要是字节串时,你把它放在格式字符串中。

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

但即使这样也是有问题的。假设您的字符串不在 ascii 字符集中...假设它是希腊语,那么 UTF8 编码的字符串超过 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)

关于python - Struct.error : argument for 's' must be a bytes object, 已经提供,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34884228/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com