Python struct的一个简单例子,但得到一个“坏字符”错误

Python struct的一个简单例子,但得到一个“坏字符”错误,python,struct,Python,Struct,我试图读取二进制文件的一部分,并使用struct将其解码为字符串。模块 这是一个很简单的例子。以下是字节参数: b'11:10:00\x00ng ' 下面是我尝试使用的函数: struct.unpack('utf-8', b'11:10:00\x00ng ') 输出应为12个字符,否?: '11:10:00 ng ' 由于某种原因,它返回struct格式的struct.error坏字符。发生什么事?我尝试了很多资源,但没有人有这样的例子。除了“utf-8”,我还尝试过其他格式,比如“asc

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

这是一个很简单的例子。以下是字节参数:

b'11:10:00\x00ng '
下面是我尝试使用的函数:

struct.unpack('utf-8', b'11:10:00\x00ng ')
输出应为12个字符,否?:

'11:10:00 ng '
由于某种原因,它返回struct格式的struct.error坏字符。发生什么事?我尝试了很多资源,但没有人有这样的例子。除了“utf-8”,我还尝试过其他格式,比如“ascii”

编辑-似乎有混乱;也许我应该用不那么笼统的术语来描述我的问题:

我正在尝试编写一个命令,该命令将以可变格式对使用f.read创建的bytes对象进行解码,我尝试这样做:

Value=struct.unpack格式,字节[0]

在哪里 字节=f.readLength 和 格式='i' 或者“d”或者其他什么

我所尝试的方法对于整数“I”非常有效,但是对于字符串却不起作用——我得到了错误,我正在试图找出原因。谢谢你的帮助

edit2-对于我之后的任何人来说,在python中使用单个函数似乎根本不可能处理这个问题,因为struct.unpack函数不处理unicode字符串和解码。函数不处理编码的数字。我需要做的唯一方法似乎是使用if:为格式应用适当的功能

EDIT 否i不是使用str.decode的有效编码 看见 no utf-8不是传递给struct.unpack的有效格式字符串 看见 老安瑟。。。 struct.unpack不是此处使用的正确工具

b'11:10:00\x00ng '.decode("utf8")
b'+\r\x00\x00'.decode("utf8")
我相信,您只需要将字节解码为unicode字符串

如果要对字符串进行struct.unpack,可以。。。但它只是打开了一个bytestring

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')

结构模块所做的工作与您尝试做的完全不同。它用于反序列化看起来像序列化C结构的数据,因此得名。整数、双精度、固定大小的字符数组,诸如此类的东西,以固定对齐和填充的刚性布局打包在一起。如果查看,您将看不到任何与Unicode编解码器相关的内容,并且格式字符串参数格式看起来与编解码器名称完全不同

您需要内置的bytestring解码方法,该方法执行Unicode解码:

b'11:10:00\x00ng '.decode('utf-8')

尽管\x00仍然是一个Unicode NUL,而不是一个空格,因为Unicode不是这样工作的。

struct.unpack'utf-8',…-等等你认为struct.unpack到底做了什么?例如,struct.unpack'i',b'+\r\x00\x00'将bytes对象解压为一个整数3371。但是,在这种情况下,我需要将其解压为ascii字符。我不明白你在说什么。问题是,这对整数格式的b'+\r\x00\x00'的示例不起作用。我得到错误未知编码“我”什么?你没有道理。。。这不是你显示的字符串,也没有我参与的编码。。。查看我的编辑-我有一个以可变方式编码的任意字节字符串,我需要一行代码来处理字符串的大小写,比如b'11:10:00\x00ng',或者一个整数,比如b'+\r\x00\x00'@Nate。你要求的是两件不同的事情,从字节中获取字符串和从字节中获取整数。这两种方法的程序非常不同。你不会得到一条可以互换处理它们的语句,可能是结构中没有这种功能。模块,但我不知道!那么,我说的对吗,我只是不能用一个函数来处理我试图处理的情况?我知道struct.unpack对于整型/浮点型格式很好,但它不适用于unicode字符串。另一方面,decode不适用于整数等,但会对字符串进行解码。我知道它们的用途,我只是想找到一种方法来处理所有这些情况,而不使用if/then循环。@Nate:Unicode编码/解码根本不是struct模块设计任务的一部分。它是为structs设计的。谢谢。我是化学家,不是程序员,所以我的基础知识很薄弱。我不知道struct是什么,也不知道bytestring的格式“I”和“utf8”之间的区别。实际上,我这样做只是为了解码红外光谱的专有格式,但到目前为止我已经取得了成功。