python - 字节表示中的\t 和\r 是什么?

标签 python python-3.x binary byte

import sys
for i in range(30):
#     a = int(str(i),base = 16).to_bytes(4,sys.byteorder)
    a = i.to_bytes(4,sys.byteorder)
    print(a)

这里的 sys.byteorder 似乎是 'little'。上面代码的输出是:

b'\x00\x00\x00\x00'
b'\x01\x00\x00\x00'
b'\x02\x00\x00\x00'
b'\x03\x00\x00\x00'
b'\x04\x00\x00\x00'
b'\x05\x00\x00\x00'
b'\x06\x00\x00\x00'
b'\x07\x00\x00\x00'
b'\x08\x00\x00\x00'
b'\t\x00\x00\x00'
b'\n\x00\x00\x00'
b'\x0b\x00\x00\x00'
b'\x0c\x00\x00\x00'
b'\r\x00\x00\x00'
b'\x0e\x00\x00\x00'
b'\x0f\x00\x00\x00'
b'\x10\x00\x00\x00'
b'\x11\x00\x00\x00'
b'\x12\x00\x00\x00'
b'\x13\x00\x00\x00'
b'\x14\x00\x00\x00'
b'\x15\x00\x00\x00'
b'\x16\x00\x00\x00'
b'\x17\x00\x00\x00'
b'\x18\x00\x00\x00'
b'\x19\x00\x00\x00'
b'\x1a\x00\x00\x00'
b'\x1b\x00\x00\x00'
b'\x1c\x00\x00\x00'
b'\x1d\x00\x00\x00'

注意这里的整数 9 被写成 b'\t\x00\x00\x00' 以及类似的奇怪的东西,例如 0xa0xd.

这是一种异常还是我缺乏这些符号的知识? 我的 Python 版本是 3.8.2。

最佳答案

我认为部分问题在于您在两种意义上使用 bytes。它可以表示数据类型,也可以表示表示。并且您期望数据类型 byte 的变量将具有特定的字节表示形式。

让我们从这些等价开始:

>>> b"\x09\x0a\x0b\x0c\x0d\x0e" == b"\t\n\x0b\x0c\r\x0e" == bytes([9,10,11,12,13,14])
True

如你所见,虽然这 6 个字节在 Python 代码中的 representations 不同,但 data 是相同的。如果您只是在一堆字节上调用 print() ,则中间一个是 Python 的默认表示。

如果您只关心将整数值 0 到 29 显示为 2 个十六进制数字,那么您只需将整数格式化为 2 个十六进制数字,如下所示:

for i in range(30):
    print (f"{i:02x}")
    
00
01
02
03
...
1b
1c
1d

如果你想要一个前导的 0x,那么把它放在 f-string 中的左大括号之前。

您实际上无法将整数值转换为数据类型字节(我认为您可能一直在尝试通过调用 to_bytes()),因为 Python 没有字节数据类型。 to_bytes() 返回一个 bytes,它在 Python 级别的行为类似于 0-255 范围内的整数列表,其默认的屏幕表示是字节串。

格式仅影响值在屏幕上的显示方式。如果您希望将十六进制表示返回到变量中(例如,因为您正在编写十六进制编辑器,并且需要在自己的代码中操作外观),那么正如@Harmon758 所说,使用 hex()函数:

for i in range(30):
    h = hex(i)
    print (h)

这给出了与 print (f"0x{i:02x}") 相同的输出,但它没有做同样的事情,因为 h 不是integer,它是一个长度为 4 的字符串。只有屏幕表示是相同的。如果您希望字符串看起来有点不同(例如,大写 X 或 4 个前导零),您可以使用 f-string 而不是调用 十六进制():

>>> i = 29
>>> h = f"0X{i:04x}"
>>> h
'0X001d'
>>> h = f"0X{i:04X}"
>>> h
'0X001D'

关于python - 字节表示中的\t 和\r 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59908012/

相关文章:

python - 可选参数初始化中的访问类

C++将字符串输入的二进制转换为十进制

Python 使用元组中的索引组合列表列表中的信息

python - 将 UV 更改从 .fbx 文件合并回 Maya

Python 元组解包

c# - 在c#中将字节转换为二进制字符串

c++ - 制作索引创建类

python - 在体内创建变量时正确使用 tf.while_loop

python - 在 Python 中列出所有 Google Drive 文件和文件夹并保存 ID

python - 根据数组的另一列聚合一列中的最小最大值 - Python