python结构-帮助理解一些语法

python结构-帮助理解一些语法,python,struct,Python,Struct,我有一个签名整数数组,我想将其解释为二进制数据,因此我在谷歌上搜索了一下,找到了这个短循环来迭代数组并生成所需的输出: import struct data = [-24, -4, -19, 100,...,98, 0] unpacked = "" for d in data: unpacked += struct.pack("i", d)[0] print unpacked 通过阅读,我了解到这是以“I”格式解释数据,等同于int。[0]在这个代码中做什么 另外,如何以十六进制

我有一个签名整数数组,我想将其解释为二进制数据,因此我在谷歌上搜索了一下,找到了这个短循环来迭代数组并生成所需的输出:

import struct

data = [-24, -4, -19, 100,...,98, 0]
unpacked = ""

for d in data:
    unpacked += struct.pack("i", d)[0]

print unpacked
通过阅读,我了解到这是以“I”格式解释数据,等同于int。
[0]
在这个代码中做什么

另外,如何以十六进制字节输出结果


谢谢

我认为这是一个错误
struct.pack()
返回压缩的字节。由于该格式要求32位整数,因此返回4个字节。
[0]
取其中的第一个字节。但是如果压缩数超出8位范围,它将被截断。您应该改为使用
b
格式,该格式用于
signed char
。这样,如果数字超出范围,您将得到一个适当的异常

>>> struct.pack("b", 1000)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
struct.error: byte format requires -128 <= number <= 127

我认为这是一个错误
struct.pack()
返回压缩的字节。由于该格式要求32位整数,因此返回4个字节。
[0]
取其中的第一个字节。但是如果压缩数超出8位范围,它将被截断。您应该改为使用
b
格式,该格式用于
signed char
。这样,如果数字超出范围,您将得到一个适当的异常

>>> struct.pack("b", 1000)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
struct.error: byte format requires -128 <= number <= 127

struct
包为整数生成一个二进制字符串。
i
表示一个4字节整数。因此,它将返回一个带有四个字节的bytestring

[0]
表示您希望获取第一个字节。如果机器的尾数很小,这意味着将获得最低有效字节。我猜算法的设计者是在追求这个。因此,这意味着如果数据在0-255范围内,您将获得一个包含该数据一个字节的bytestring


如果机器是大端的话。一个将获得最高有效位。对于您的示例,负值为255,正值为0,因为示例中的所有值似乎都在-255-255范围内。

struct包为整数生成一个二进制字符串。
i
表示一个4字节整数。因此,它将返回一个带有四个字节的bytestring

[0]
表示您希望获取第一个字节。如果机器的尾数很小,这意味着将获得最低有效字节。我猜算法的设计者是在追求这个。因此,这意味着如果数据在0-255范围内,您将获得一个包含该数据一个字节的bytestring


如果机器是大端的话。一个将获得最高有效位。对于您的示例,负值为255,正值为0,因为示例中的所有值似乎都在-255-255范围内。

这些值应该是4字节的整数、字符还是什么?此外,您必须比“以十六进制字节输出结果”更具体。Python没有十六进制的特定类型。如果你想用十六进制打印它,你必须对输出格式更具体一点;如果您想在Python内部以十六进制格式执行某些操作,您可能会对实际需要的内容感到困惑。是的,我的意思是用十六进制打印到控制台,根据下面的答案,还有4字节整数。这些应该是4字节整数、字符还是什么?此外,您必须比“以十六进制字节输出结果”更具体。Python没有十六进制的特定类型。如果你想用十六进制打印它,你必须对输出格式更具体一点;如果您想在Python内部以十六进制格式执行某些操作,您可能会对实际需要的内容感到困惑。是的,我的意思是用十六进制打印到控制台,根据下面的答案,还有4字节整数。这肯定是一个bug。处理单个值时,
unpack
需要
[0]
。也许我们不得不归咎于累加器的误导性名称(
unpacket
)太棒了,它对我来说也没有意义,因为它是打包而不是解包。很高兴知道这是一个bug,而你上面的代码正是我想要的。谢谢这肯定是一只虫子。处理单个值时,
unpack
需要
[0]
。也许我们不得不归咎于累加器的误导性名称(
unpacket
)太棒了,它对我来说也没有意义,因为它是打包而不是解包。很高兴知道这是一个bug,而你上面的代码正是我想要的。谢谢