2024-10-01 13:44:49 发布
网友
我正在阅读一个python代码库,我被这句话难住了:
struct.pack( "<ii%ds"%len(value), ParameterTypes.String, len(value), value.encode("UTF8") )
除了%d之外,我什么都懂,我不知道为什么{}的长度要分两次打包。在
%d
据我所知,这个结构将使用很少的尾数编码(<),并且将包含两个整数(ii),后跟%d,然后是一个字符串(s)。在
<
ii
s
%d的意义是什么?在
它用于指定将len(value)字符的字符串(value)压缩在这两个整数之后。在
len(value)
value
例如,如果value包含"boo",那么{}的实际格式说明符将是"<ii3s"。在
"boo"
"<ii3s"
啊,令人难以置信的是。。。。在
@S.Lott:““我不认为这个数字特别重要,因为没有它,Python会倾向于正确打包。”“”“-1。不要思考;调查。没有数字意味着数字默认为1。包装是否正确???也许你认为struct.pack("s", foo)和{}的工作方式相同?它不是;docs说“”对于“s”格式字符,计数被解释为字符串的大小,而不是像其他格式字符那样的重复计数;例如,“10s”表示单个10字节字符串,“10c”表示10个字符。对于打包,字符串会根据需要截断或填充空字节以使其适合。“”“
struct.pack("s", foo)
@Brendan:-1。value不是一个数组(不管是什么);它显然是想成为一个unicode字符串。。。看这里:value.encode("UTF8")
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"))
现在让我们假设value是u'\xff\xff',所以{}是2。在
u'\xff\xff'
让v8=value.encode('UTF8'),即'\xc3\xbf\xc3\xbf'。在
v8
value.encode('UTF8')
'\xc3\xbf\xc3\xbf'
注意,len(v8)是4。硬币掉下来了吗?在
len(v8)
所以我们现在拥有的是
struct.pack("<i2s", 2, v8)
数字2被压缩为4个字节,02 00 00 00。4字节字符串v8被截断(按“2s”中的长度2“)为2。数据丢失。失败。在
02 00 00 00
正确的方法是:
它是一个普通的string format,用于创建结构格式
试着以普通字符串的形式开始阅读(暂时忘掉struct)。。。在
struct
"<ii%ds" % len(value)
例如,如果值iterable的长度是4,那么字符串将是<ii4s。然后将其传递给struct.pack,准备打包两个整数,后跟valueiterable中一个长度为4字节的字符串
<ii4s
struct.pack
它用于指定将
len(value)
字符的字符串(value
)压缩在这两个整数之后。在例如,如果}的实际格式说明符将是
value
包含"boo"
,那么{"<ii3s"
。在啊,令人难以置信的是。。。。在
@S.Lott:““我不认为这个数字特别重要,因为没有它,Python会倾向于正确打包。”“”“-1。不要思考;调查。没有数字意味着数字默认为1。包装是否正确???也许你认为}的工作方式相同?它不是;docs说“”对于“s”格式字符,计数被解释为字符串的大小,而不是像其他格式字符那样的重复计数;例如,“10s”表示单个10字节字符串,“10c”表示10个字符。对于打包,字符串会根据需要截断或填充空字节以使其适合。“”“
struct.pack("s", foo)
和{@Brendan:-1。
value
不是一个数组(不管是什么);它显然是想成为一个unicode字符串。。。看这里:value.encode("UTF8")
@Matt Ellen:你引用的代码行严重损坏。如果
value
中有任何非ASCII字符,则数据将丢失。让我们把它分解:
通过删除第一项来减少问题空间
struct.pack("<i%ds"%len(value), len(value), value.encode("UTF8"))
现在让我们假设}是2。在
value
是u'\xff\xff'
,所以{让
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
)。。。在例如,如果值iterable的长度是4,那么字符串将是
<ii4s
。然后将其传递给struct.pack
,准备打包两个整数,后跟value
iterable中一个长度为4字节的字符串相关问题 更多 >
编程相关推荐