首页 > 解决方案 > 将不可打印的字节转换为字符串

问题描述

我有一个要转换为对象的 python3bytes对象(使用struct.packor生成) 。注意 using在这里不起作用,因为它会拒绝转换不可打印的字符。to_bytesstrbytes.encode("ascii")

我怎样才能做到这一点?

我正在尝试将整数转换为str对象中的二进制表示形式,以便11将其表示为"\x00\x00\x00\x0b"(注意这是一个str对象而不是bytes)。

我目前正在做的事情适用于不具有0x80或以上字节的较低整数:

In [94]: i = 11

In [95]: i.to_bytes(2, 'big')
Out[95]: b'\x00\x0b'

In [96]: i.to_bytes(2, 'big').decode('ascii')
Out[96]: '\x00\x0b'

但是,对于将使用字节的 MSbit 表示的整数,它会中断:

In [97]: i = 250

In [98]: i.to_bytes(2, 'big')
Out[98]: b'\x00\xfa'

In [99]: i.to_bytes(2, 'big').decode('ascii')
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-100-d5fe6014b48a> in <module>
----> 1 i.to_bytes(2, 'big').decode('ascii')

UnicodeDecodeError: 'ascii' codec can't decode byte 0xfa in position 1: ordinal not in range(128)

我怎样才能转换i = 250"\x00\xfa"

谢谢!

附言

这样做的原因是我要调用的函数需要一个str对象而不是一个bytes对象,我理解这不是 pyton3str对象的预期目标(并且欣赏和之间的分离strbytes,但这仍然是我希望在这里完成的.

标签: pythonpython-3.x

解决方案


如何格式化字节的字符串表示(不解码字符!)?

import struct

i = 250
s = str(struct.pack('>H', i)).replace('b', '').replace("'", "")

print(s)
>>> \x00\xfa

推荐阅读