[高x深] -> 30 82 01 22 30
[Python]
with open("{filename}", "rb") as f:
byte = f.read(5)
print(byte)
-> b'0\x82\x01"0'
我期望 b'\x30\x82\x01\x22\x30' 我怎样才能像这样打印?
也许我认为 \x22 -> ASCII 34 -> " 我该如何解决这个问题?
没有什么需要修复的。
b'\x30\x82\x01\x22\x30' == b'0\x82\x01"0'
。这是相同的字节串,就像 1.000 == 1.0
- 不同的文字,相同的值。但只有一种规范表示形式,因为 Python 无法知道您可能需要哪种等效表示形式。当您打印 1.2 - 0.2
的结果时,您会得到 1.0
,而不是 1.000
,并且您需要通过格式化将其转换为字符串,以使其看起来像 1.000
(如果这就是您希望输出的样子)喜欢。这里的工作机制是相同的。
(此外,
0
和"
不是特殊字符。\x82
和\x01
在这里是特殊字符,因为它们不存在于ASCII中,这就是为什么它们在规范表示中被转义。)
现在,如果您只是想打印
b'\x30\x82\x01\x22\x30'
,因为您认为它对最终用户来说更漂亮,那么您将必须自己构造该字符串;例如,
bs = b'0\x82\x01"0'
bs_alt_repr = "b'" + "".join(fr"\x{c:02x}" for c in bs) + "'"
print(bs_alt_repr)
# => b'\x30\x82\x01\x22\x30'
以二进制模式读取文件时,可能会出现特殊字符,因为二进制模式将文件内容视为原始字节序列,没有任何解释或编码。二进制模式允许您读取文件中存储的实际二进制数据,包括控制字符、特殊字符和不可打印字符。
您可以通过添加显示字节实际值而不是转义序列的 repr 来修改代码
with open("signCert.der", "rb") as f:
byte = f.read(5)
print(repr(byte))