为什么以二进制模式读取文件时会出现特殊字符?

问题描述 投票:0回答:2

[高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 -> " 我该如何解决这个问题?

python file binary hex
2个回答
2
投票

没有什么需要修复的。

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'

0
投票

以二进制模式读取文件时,可能会出现特殊字符,因为二进制模式将文件内容视为原始字节序列,没有任何解释或编码。二进制模式允许您读取文件中存储的实际二进制数据,包括控制字符、特殊字符和不可打印字符。

您可以通过添加显示字节实际值而不是转义序列的 repr 来修改代码

with open("signCert.der", "rb") as f:
    byte = f.read(5)
    print(repr(byte))
© www.soinside.com 2019 - 2024. All rights reserved.