换行符被解释为 Ð (0xd0) 而不是 (0x0a),我真的不知道如何解决这个问题。我也不知道从哪里开始。
当尝试使用 此 代码时,它将 0x0a 读为 0xd0。
with open(path, "rb") as root:
b_arr = root.read() + b" "
print("Processing...")
buffer = ""
b_arr_wizard = ""
chars = ""
for i in range(len(b_arr)):
if i % 16 == 0 or i == len(b_arr)-1:
print(len(buffer))
buffer += " "*((16*3)-len(buffer))
buffer += "| "
for _ in buffer.split():
if _ == "|":
continue
#print(_)
if int(_, base=16) >= 32:
buffer += chr(int(_, base=16))
chars += chr(int(_, base=16))
else:
buffer += "."
chars += chr(int(_, base=16))
b_arr_wizard += buffer + "\n"
buffer = ""
buffer += str(hex(b_arr[i])[2:])+ "0"*(2-len(str(hex(b_arr[i])[2:]))) + " "
用在文件上:
abc
def
返回:
61 62 63 d0 a0 64 65 66 | abcÐ def
问题在于你的代码没有正确处理字节和字符之间的区别。你在使用
chr(int(_, base=16))
来将十六进制值转换成字符时,实际上是在用 ASCII 编码来解释它们。然而,
0xd0
在 ASCII 中并不是换行符,而是字符
Ð
。
为了解决这个问题,你需要使用一种方法来将字节解码成你想要的编码。由于你没有指定文件的编码,我假设它是 UTF-8,这是最常见的编码之一。
修改后的代码如下:
with open(path, "rb") as root:
b_arr = root.read() + b" "
print("Processing...")
buffer = ""
b_arr_wizard = ""
chars = ""
for i in range(len(b_arr)):
if i % 16 == 0 or i == len(b_arr)-1:
print(len(buffer))
buffer += " "*((16*3)-len(buffer))
buffer += "| "
# 使用 UTF-8 解码字节
decoded_chars = buffer.replace(" ", "").encode("latin-1").decode("utf-8")
for char in decoded_chars:
if char.isprintable():
buffer += char
chars += char
else:
buffer += "."
chars += char
b_arr_wizard += buffer + "\n"
buffer = ""
buffer += str(hex(b_arr[i])[2:])+ "0"*(2-len(str(hex(b_arr[i])[2:]))) + " "
解释:
-
解码字节
: 在这段代码中,我们首先使用
buffer.replace(" ", "").encode("latin-1")
将十六进制字符串转换成字节串。由于buffer
中包含空格,我们需要先移除它们。然后,我们使用decode("utf-8")
将字节串解码成 Unicode 字符串。 -
处理不可打印字符
: 我们使用
char.isprintable()
方法来判断字符是否可打印。如果是,我们直接将其添加到buffer
和chars
中。否则,我们添加一个.
来表示这是一个不可打印字符。
通过这些修改,你的代码现在应该能够正确地将换行符解释为
\n
,并将
0x0a
显示为换行符而不是
Ð
。