Python 字节表示法中的\t和\r是什么?

Python 字节表示法中的\t和\r是什么?,python,python-3.x,binary,byte,Python,Python 3.x,Binary,Byte,这里的sys.byteorder似乎是“小”的。上述代码的输出为: 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) 注意这里的整数9写得很讨厌,它是b'\t\x00\x00\x00',还有类似的异常,例如0xa和0xd 这是一种反常现象还是我缺乏这些符号的知识? 我的P

这里的
sys.byteorder
似乎是“小”的。上述代码的输出为:

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)
注意这里的整数9写得很讨厌,它是
b'\t\x00\x00\x00'
,还有类似的异常,例如
0xa
0xd

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

这些是转义序列。
\t
表示ASCII水平制表符(制表符),而
\r
表示ASCII回车符(CR)


请参阅。

这些是转义序列。
\t
表示ASCII水平制表符(制表符),而
\r
表示ASCII回车符(CR)


请参阅。

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

让我们先看看这些等价物:

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'
如您所见,尽管Python代码中这6个字节的表示形式不同,但数据是相同的。中间一个是Python的默认表示形式,如果您只需对一组字节调用
print()

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

>>> b"\x09\x0a\x0b\x0c\x0d\x0e" == b"\t\n\x0b\x0c\r\x0e" == bytes([9,10,11,12,13,14])
True
如果需要一个前导的
0x
,请将其放在开头大括号之前的
f
-字符串中

实际上,您无法将整数值转换为数据类型byte(我认为您可能一直在尝试调用
to_bytes()
),因为Python没有字节数据类型
to_bytes()
返回一个
bytes
,这是一个范围为0–255的整数列表,其默认屏幕表示形式是bytestring

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

for i in range(30):
    print (f"{i:02x}")

00
01
02
03
...
1b
1c
1d
这将提供与打印(f“0x{i:02x}”)相同的输出,但它的作用不同,因为
h
不是整数,而是长度为4的字符串。只有屏幕表示是相同的。如果希望字符串看起来有点不同(例如,大写的
X
,或4个前导零),可以使用
f
-字符串而不是调用
hex()


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

让我们先看看这些等价物:

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'
如您所见,尽管Python代码中这6个字节的表示形式不同,但数据是相同的。中间一个是Python的默认表示形式,如果您只需对一组字节调用
print()

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

>>> b"\x09\x0a\x0b\x0c\x0d\x0e" == b"\t\n\x0b\x0c\r\x0e" == bytes([9,10,11,12,13,14])
True
如果需要一个前导的
0x
,请将其放在开头大括号之前的
f
-字符串中

实际上,您无法将整数值转换为数据类型byte(我认为您可能一直在尝试调用
to_bytes()
),因为Python没有字节数据类型
to_bytes()
返回一个
bytes
,这是一个范围为0–255的整数列表,其默认屏幕表示形式是bytestring

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

for i in range(30):
    print (f"{i:02x}")

00
01
02
03
...
1b
1c
1d
这将提供与打印(f“0x{i:02x}”)相同的输出,但它的作用不同,因为
h
不是整数,而是长度为4的字符串。只有屏幕表示是相同的。如果希望字符串看起来有点不同(例如,大写的
X
,或4个前导零),可以使用
f
-字符串而不是调用
hex()


您希望每个字节都以一致的表示形式输出。但您的代码要求输出为bytesting。bytestring将可打印的ascii显示为字符,对Python定义的非打印字符(如换行符和制表符)使用反斜杠转义,其余字符仅后退为十六进制转义。如果您对输出的格式化方式有强烈的感觉,那么您就有足够的工具来实现这一点。默认表示法实际上非常有用。例如,
b“hello world”
比一堆十六进制转义要友好得多。我要说的是,格式对我来说很重要:P我只需要一个代码来转换我们在高中学习过的十六进制表示法中的数字。我开始用数字做实验,因为我完全知道会发生什么。我的最终目的是获取我输入的任何数字的十六进制“字符串”。我本来希望
to_bytes()
能让我在那里停留,但事实并非如此。您建议我下一步做什么?为什么不直接使用?您希望每个字节都以一致的表示形式输出。但您的代码要求输出为bytesting。bytestring将可打印的ascii显示为字符,对Python定义的非打印字符(如换行符和制表符)使用反斜杠转义,其余字符仅后退为十六进制转义。如果您对输出的格式化方式有强烈的感觉,那么您就有足够的工具来实现这一点。默认表示法实际上非常有用。例如
b“hello world”
是mu