如何修复‘struct.error: char format requires a bytes object of length 1’错误
解决struct.pack的两个常见格式符错误
让我们一步步拆解你遇到的问题,其实核心是对struct模块中c和s格式符的用法理解偏差:
第一个错误:struct.error: char format requires a bytes object of length 1
你用了格式符<10c,这里的c代表单个字符(单字节),10c意味着struct.pack需要接收10个独立的单字节参数(比如struct.pack('<10c', b'<', b's', b'e', ...))。但你通过*iter把b'<setup pro'拆成了一串单字节元素,而这个字节串的长度显然不足10,同时这也不是你真正想要的操作——你是想把整个配置字符串打包成一个10字节的结构,而不是逐个传入字符。
第二个错误:struct.error: pack expected 1 items for packing (got 10)
改成<10s后,s格式符代表字节串,10s表示需要接收一个单个的字节串参数,这个参数会被自动调整为10字节(短则补\x00,长则截断)。但你依然用了*iter把字节串拆成了10个单字节参数,这就导致传入了10个参数,而10s只需要1个,所以报错。
正确的实现代码
你需要直接把整个字节串作为参数传给struct.pack,不需要拆包:
import struct iter = b'<setup pro' fullfmt = '<10s' header = b'#510' # 用10s格式直接传入完整字节串,自动处理长度补全 result = header + struct.pack(fullfmt, iter)
这段代码会生成你预期的结果:header加上10字节的配置内容(如果原字节串长度不足10,会用空字节\x00填充到10字节)。
举个例子,如果iter是b'<setup pro'(9字节),struct.pack('<10s', iter)会返回b'<setup pro\x00',最终result就是b'#510<setup pro\x00',完全符合你打包配置并拼接头的需求。
内容的提问来源于stack exchange,提问作者bcunning
相关产品推荐
相关产品推荐

