【问题标题】:What are \t and \r in byte representation?字节表示中的 \t 和 \r 是什么?
【发布时间】:2020-05-11 11:07:49
【问题描述】:
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 似乎是'小'。上面代码的输出是:

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。

【问题讨论】:

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

标签: python python-3.x binary byte


【解决方案1】:

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

Python's documentation of String and Bytes literals

【讨论】:

  • 我明白了。我只是没想到他们会在这里。我想要常规的\x09\x0a。并感谢您的编辑:)
【解决方案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 代码中的 表示形式 不同,但 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,它是一个 0-255 范围内的整数列表,其默认的屏幕表示是一个字节串。

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

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

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

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

【讨论】:

  • 一次要处理很多事情。但是你给了我一个比我的方法更好的解决方案。我将模拟您的解释以更好地理解它。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2019-12-29
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多