我试图读取二进制文件的一部分,并使用该结构将其解码为一串字符。模块。
这是一个足够简单的案例。这是bytes参数:
b'11:10:00\x00ng '
这是我试图使用的功能:
struct.unpack('utf-8', b'11:10:00\x00ng ')
输出应为12个字符,不是?:
'11:10:00 ng '
由于某种原因它返回"struct.error bad char in struct format"
。发生了什么事?我尝试了很多资源,但没有人有这样的例子。除'utf-8'
之外,我还尝试了其他格式,例如'ascii'
。
我正在尝试编写一个命令,它将以变量格式解码使用f.read创建的字节对象,我尝试这样做:
Value = struct.unpack(Format,Bytes)[0]
,其中 字节= f.read(长度) 和 格式='我' 或者' d'或者它需要的任何东西。
我尝试过的是一个整数(' i')的情况很好但是对于一串字符的情况不起作用 - 我得到了错误,而我正在尝试找出原因。谢谢你的帮助!
edit2 - 对于任何追随我的人来说,看起来这根本不可能用单个函数在python中处理,因为struct.unpack函数不处理unicode字符串和解码。函数不处理编码数字。做我需要做的唯一方法似乎是使用if:为格式应用适当的函数
答案 0 :(得分:1)
"i"
不是使用str.decode
的有效编码
"utf-8"
不是要传递给struct.unpack
的有效格式字符串
struct.unpack
不适合在此使用
b'11:10:00\x00ng '.decode("utf8")
b'+\r\x00\x00'.decode("utf8")
你只想将字节解码为我相信的unicode字符串
如果你想struct.unpack
一个字符串,你可以...但它只是解压缩一个字节串
fmt = "bb5s" #2 bytes and a string of length 5
struct.unpack(fmt,b"\x00\x12\x33\x43\x55\x77\x65")
#result: (0, 18, b'3CUwe')
答案 1 :(得分:1)
struct模块完成了与您尝试的完全不同的工作。它用于反序列化看起来像序列化C结构的数据(因此得名)。 int
s,double
s,固定大小的char
数组,类似的东西,以固定对齐和填充的刚性布局打包在一起。如果查看docs,您将看不到与Unicode编解码器相关的任何内容,并且格式字符串参数格式看起来不像编解码器名称。
你想要内置的字节串decode
方法,它进行Unicode解码:
b'11:10:00\x00ng '.decode('utf-8')
虽然\x00
仍然是Unicode NUL,而不是空格,因为Unicode不能像那样工作。