Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 结构包打印字符串而不是二进制值_Python_Struct_Pack - Fatal编程技术网

Python 结构包打印字符串而不是二进制值

Python 结构包打印字符串而不是二进制值,python,struct,pack,Python,Struct,Pack,为什么我的struct.pack打印的是字符串而不是二进制流 var = struct.pack('hhl3sf', 1, 2, 3, 'm6y', 2.7) print repr(var) 输出为: '\x01\x00\x02\x00\x03\x00\x00\x00m6y\x00\xcd\xcc,@' “m6y”是否应打印为\x6d\x36\x79?若并没有,我怎么能直接从包中打印出来作为她的或只是简单的二进制文件? 为什么结尾是char@print?谢谢 我尝试将所有值转换为ascii

为什么我的struct.pack打印的是字符串而不是二进制流

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

'\x01\x00\x02\x00\x03\x00\x00\x00m6y\x00\xcd\xcc,@'
“m6y”是否应打印为\x6d\x36\x79?若并没有,我怎么能直接从包中打印出来作为她的或只是简单的二进制文件? 为什么结尾是char@print?谢谢

我尝试将所有值转换为ascii,然后用十六进制打印它们。 还运行binascii.hexlify。 这两种方法都有效,但我想知道为什么pack不能自动完成这项工作。谢谢

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


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

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字符,默认情况下显示为

\0x48\0x65\0x6c\0x6c\0x6f\0x20\0x77\0x6f\0x72\0x6c\0x64

不友好。

字符串打印问题

在(开头的某个地方),我试图简要地解释一下这种行为。基本上,当向用户显示某些内存内容时,如果某个字节具有相应的可打印字符,则使用该字符(请注意,这仅用于表示,不影响内存内容)
如果您想绕过此行为,则必须手动操作(有多种方法-我不会坚持)。但请记住,这样做,产生的字符串将不会与原始字符串等效:

>b0=b“\x41”
>>>b0
b'A'
>>>len(b0)
1.
>>>
>>>b1=”“.join(“\\x{:02X}”.b0中c的格式(c))
>>>b1
“\\x41”
>>>len(b1)
4.
结束字符问题

张贴页面

将问题分解为简单的问题并分别解决:

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

    导入结构 >>> >>>s0=结构包(b“f”,2.7) >>>s0 b'\xcd\xcc,@' >>>len(s0) 4. >>> >>>s1=结构包(b“f”,1.7) >>>s1 b'\x9a\x99\xd9?' >>>len(s1) 4.
  • 我认为混淆是由最后一个“\x00”字节(
    var[-5]
    )造成的:

    结构包(b“3sI”,b“ABC”,0xFFFFFF) b'ABC\x00\xff\xff\xff\xff' >>> >>>结构包(b“@3sI”,b“ABC”,0xFFFFFF) b'ABC\x00\xff\xff\xff\xff' >>> >>>结构包(b“=3sI”,b“ABC”,0xFFFFFF) b'ABC\xff\xff\xff\xff' >>> >>> >>>结构包(b“4sI”,b“ABCD”,0xFFFFFF) b'ABCD\xff\xff\xff\xff' >>> >>>结构包(b“1sI”,b“A”,0xFFFFFF) b'A\x00\x00\x00\xff\xff\xff\xff\xff' >>> >>>结构包(b“1sH”,b“A”,0xFFFF) b'A\x00\xff\xff' >>> >>>结构包(b“1sB”,b“A”,0xFF) b'A\xff' >>> >>>结构包(b“1sd”,b“A”,2.7) b'A\x00\x00\x00\x00\x00\x00\x00\x9a\x99\x99\x99\x99\x05@' 从上面的例子中可以看出,它与我们的浮点数无关,而是与前面的字符串有关,这是一个对齐的问题(对于浮点,它是4字节)。查看更多详细信息