一个简单的结构案例,但是得到一个"坏字符"错误

时间:2016-09-12 17:51:18

标签: python struct

我试图读取二进制文件的一部分,并使用该结构将其解码为一串字符。模块。

这是一个足够简单的案例。这是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:为格式应用适当的函数

2 个答案:

答案 0 :(得分:1)

修改

  1. 没有"i"不是使用str.decode的有效编码
  2. 没有"utf-8"不是要传递给struct.unpack的有效格式字符串
  3. 旧的anser ......

    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不能像那样工作。