我需要在Objective-C中重写一些Python脚本。这并不难,因为Python很容易阅读,但这段代码让我感到有点困难。
def str_to_a32(b):
if len(b) % 4:
# pad to multiple of 4
b += '\0' * (4 - len(b) % 4)
return struct.unpack('>%dI' % (len(b) / 4), b)
这个功能应该做什么?
答案 0 :(得分:3)
我不是肯定的,但是我正在使用documentation来刺激它。
查看文档,我们将根据格式字符串返回一个元组:
根据给定的格式解压缩字符串(可能由pack(fmt,...)打包)。结果是一个元组,即使它只包含一个项目。该字符串必须包含格式所需的数据量(len(字符串)必须等于calcsize(fmt))。
进入的项目(b
)可能是一个字节缓冲区(表示为字符串) - 查看它们代表的示例\x
转义符{ {3}}接下来的两个字符为十六进制。
格式字符串似乎是
'>%dI' % (len(b) / 4)
%
和%d
将在格式字符串中添加一个数字,因此如果b的长度为32,则格式字符串变为
`>8I`
格式字符串的第一部分是>
,which consumes表示将字节顺序设置为big-endian,大小设置为标准。
I
表示它将是一个大小为4(documentation)的无符号整数,而它前面的8表示它将重复8次。
>IIIIIIII
所以我认为这是说:取这个字节缓冲区,通过追加尽可能多的0x00
来确保它是4的倍数,然后将其解压缩到具有尽可能多的无符号整数的元组中。缓冲区中的4个字节的块。
答案 1 :(得分:0)
看起来它应该将一个字节输入数组表示为字符串并将它们解压缩为big-endian(“>”)无符号整数('I')格式代码在{{3}中解释}
答案 2 :(得分:0)
这需要一个字符串并将其转换为无符号整数元组。如果你看the python struct
documentation,你会看到它是如何运作的。简而言之,它处理Python值和C语言结构之间的转换,这些结构表示为Python字符串,用于处理存储在文件中的二进制数据(从提供的链接中毫不客气地复制)。
在你的情况下,函数接受一个字符串b
并添加一些额外的字符以确保它是unsigned int的标准大小(参见链接),然后将其转换为元组使用字符的big endian表示的整数。这是'>'部分。 I
部分表示要使用unsigned integers