struct pack打印字符串而不是二进制值

2024-04-25 12:51:18 发布

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

为什么是我的结构包打印字符串而不是二进制流?在

var =  struct.pack('hhl3sf', 1, 2, 3, 'm6y', 2.7)
print repr(var)

输出为:

^{pr2}$

“m6y”是否应打印为\x6d\x36\x79?如果不是的话,我怎么能像她一样直接从包里打印出来呢? 为什么结尾是char@print?谢谢。在

我试着把所有的值转换成ascii,然后用十六进制打印出来。 也在跑步比纳西伊·赫克斯利菲. 两种方法都有效,但我想知道为什么pack不能自动完成这项工作。谢谢。在

map(lambda c: ord(c), var)
map(lambda i: hex(i), map(lambda c: ord(c), var))


print 'Packed value : ', binascii.hexlify(var)

Tags: lambda字符串mapvar二进制结构structpack
2条回答

Python的默认表示将bytestrings打印为可能的ascii字符,如果不可能,则仅作为\x转义。在

通常期望'm6y'被打印成\x6d\x36\x79,但这不是它的工作方式。在

如果你想看到变量全部显示为十六进制,那么你需要自己去做。例如:

>>> "".join("{0:02x}".format(b) for b in var)
'01000200030000006d367900cdcc2c40'
>>> print("".join("\\0x{0:02x}".format(b) for b in var))
\0x01\0x00\0x02\0x00\0x03\0x00\0x00\0x00\0x6d\0x36\0x79\0x00\0xcd\0xcc\0x2c\0x40

你想怎么看就看你了。bytestring通常是ascii字符,默认情况下显示b"Hello world"

^{pr2}$

不友好。在

字符串打印问题

[SO]: Python struct.pack() behavior (@CristiFati's answer)(在开头的某个地方),我试图简单地解释一下这种行为。基本上,当向用户显示一些内存内容时,如果某个字节具有相应的可打印字符,则使用该字符(注意,这仅用于表示,它不会影响内存内容)。
如果你想绕过这种行为,你必须手动完成(有很多方法-我不会坚持的)。但请记住,这样做,结果字符串将与原始字符串不等价:

>>> b0 = b"\x41"
>>> b0
b'A'
>>> len(b0)
1
>>>
>>> b1 = "".join(("\\x{:02X}".format(c) for c in b0))
>>> b1
'\\x41'
>>> len(b1)
4

结尾char问题

发布[Python 3.Docs]: struct - Interpret bytes as packed binary data页面。在

将问题分解为简单的问题,并分别处理:

  • 结果字符串末尾的'@'字符0x40)它是2.7表示的一部分:

    >>> import struct
    >>>
    >>> s0 = struct.pack(b"f", 2.7)
    >>> s0
    b'\xcd\xcc,@'
    >>> len(s0)
    4
    >>>
    >>> s1 = struct.pack(b"f", 1.7)
    >>> s1
    b'\x9a\x99\xd9?'
    >>> len(s1)
    4
    
  • 我相信混淆是由最后一个'\x00'字节(var[-5])引起的:

    >>> struct.pack(b"3sI", b"ABC", 0xFFFFFFFF)
    b'ABC\x00\xff\xff\xff\xff'
    >>>
    >>> struct.pack(b"@3sI", b"ABC", 0xFFFFFFFF)
    b'ABC\x00\xff\xff\xff\xff'
    >>>
    >>> struct.pack(b"=3sI", b"ABC", 0xFFFFFFFF)
    b'ABC\xff\xff\xff\xff'
    >>>
    >>>
    >>> struct.pack(b"4sI", b"ABCD", 0xFFFFFFFF)
    b'ABCD\xff\xff\xff\xff'
    >>>
    >>> struct.pack(b"1sI", b"A", 0xFFFFFFFF)
    b'A\x00\x00\x00\xff\xff\xff\xff'
    >>>
    >>> struct.pack(b"1sH", b"A", 0xFFFF)
    b'A\x00\xff\xff'
    >>>
    >>> struct.pack(b"1sB", b"A", 0xFF)
    b'A\xff'
    >>>
    >>> struct.pack(b"1sd", b"A", 2.7)
    b'A\x00\x00\x00\x00\x00\x00\x00\x9a\x99\x99\x99\x99\x99\x05@'
    

    从上面的例子中可以看出,它与我们的float数字没有任何关系,而是与前面的字符串有关,这是一个对齐的问题(对于float4字节)。有关更多详细信息,请查看[Wikipedia]: Data structure alignment

相关问题 更多 >