%d在中是什么意思结构包?

2024-10-01 13:44:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在阅读一个python代码库,我被这句话难住了:

struct.pack( "<ii%ds"%len(value), ParameterTypes.String, len(value), value.encode("UTF8") )

除了%d之外,我什么都懂,我不知道为什么{}的长度要分两次打包。在

据我所知,这个结构将使用很少的尾数编码(<),并且将包含两个整数(ii),后跟%d,然后是一个字符串(s)。在

%d的意义是什么?在


Tags: 代码编码stringlenvalueds整数utf8
3条回答

它用于指定将len(value)字符的字符串(value)压缩在这两个整数之后。在

例如,如果value包含"boo",那么{}的实际格式说明符将是"<ii3s"。在

啊,令人难以置信的是。。。。在

@S.Lott:““我不认为这个数字特别重要,因为没有它,Python会倾向于正确打包。”“”“-1。不要思考;调查。没有数字意味着数字默认为1。包装是否正确???也许你认为struct.pack("s", foo)和{}的工作方式相同?它不是;docs说“”对于“s”格式字符,计数被解释为字符串的大小,而不是像其他格式字符那样的重复计数;例如,“10s”表示单个10字节字符串,“10c”表示10个字符。对于打包,字符串会根据需要截断或填充空字节以使其适合。“”“

@Brendan:-1value不是一个数组(不管是什么);它显然是想成为一个unicode字符串。。。看这里:value.encode("UTF8")

@Matt Ellen:你引用的代码行严重损坏。如果value中有任何非ASCII字符,则数据将丢失。

让我们把它分解:

`struct.pack("<ii%ds"%len(value), ParameterTypes.String, len(value), value.encode("UTF8"))`  

通过删除第一项来减少问题空间

struct.pack("<i%ds"%len(value), len(value), value.encode("UTF8"))

现在让我们假设valueu'\xff\xff',所以{}是2。在

v8=value.encode('UTF8'),即'\xc3\xbf\xc3\xbf'。在

注意,len(v8)是4。硬币掉下来了吗?在

所以我们现在拥有的是

struct.pack("<i2s", 2, v8)

数字2被压缩为4个字节,02 00 00 00。4字节字符串v8被截断(按“2s”中的长度2“)为2。数据丢失。失败。在

正确的方法是:

^{pr2}$

它是一个普通的string format,用于创建结构格式

试着以普通字符串的形式开始阅读(暂时忘掉struct)。。。在

"<ii%ds" % len(value)

例如,如果值iterable的长度是4,那么字符串将是<ii4s。然后将其传递给struct.pack,准备打包两个整数,后跟valueiterable中一个长度为4字节的字符串

相关问题 更多 >