首页 > 编程问答 >当读取字节时,Python 将 \n 解释为 0xd0

当读取字节时,Python 将 \n 解释为 0xd0

时间:2024-07-28 06:59:49浏览次数:10  
标签:python

换行符被解释为 Ð (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:]))) + " "

解释:

  1. 解码字节 : 在这段代码中,我们首先使用 buffer.replace(" ", "").encode("latin-1") 将十六进制字符串转换成字节串。由于 buffer 中包含空格,我们需要先移除它们。然后,我们使用 decode("utf-8") 将字节串解码成 Unicode 字符串。
  2. 处理不可打印字符 : 我们使用 char.isprintable() 方法来判断字符是否可打印。如果是,我们直接将其添加到 buffer chars 中。否则,我们添加一个 . 来表示这是一个不可打印字符。

通过这些修改,你的代码现在应该能够正确地将换行符解释为 \n ,并将 0x0a 显示为换行符而不是 Ð

标签:python
From: 78802575

相关文章

  • 在Python 3中获取范围的特定形式
    当获取range(1,100)时,我得到:[1,2,3,4,5...99]我需要像这个范围的zip之类的东西:[50,49,51,48,52,47,53...99]如何获取它?背景:这都是关于比特币谜题66的。首先我做了对过去已知的私钥进行线性回归预测,直到第65题为止。我......
  • Python:如何使用pyaudio或sounddevice等库进行自动录音?
    我想做一个项目,需要满足以下录音要求:程序启动后,会在后台不断检测麦克风的声音,当声音分贝大于一定值时打开录音流级别,当分贝低于一定级别时关闭录音流并保存为wav文件。我知道原理,但我无法使用这些库来实现。我想实现以上结果使用Python实现自动录音以下代......
  • 当我们创建一个在 https 服务器上获取和发送数据的 python 应用程序时,我们应该如何处
    python脚本使用Urllib3,我的服务器是在Node.js上编写的脚本。我担心(并且不清楚)证书:我是否需要将我的python应用程序上的证书另存为变量?例如我这样做了,http=urllib3.PoolManager(cert_reqs="CERT_REQUIRED",ca_certs='client-cert.pem')并且我不知道......
  • 使用 Python 进行 Web 抓取以获取数据 NoneType ERROR
    我正在努力为我的学校项目获取美元和价格。所以我决定为此使用网络抓取,但我有一个问题。当我尝试在服务器上使用我的代码时,它给我NoneType错误。它可以在googlecolab上使用,但我无法在我的电脑或服务器上使用。我该如何解决这个问题?网页抓取代码;defdolar():he......
  • Python 请求 - response.json() 未按预期工作
    我正在尝试从Python的requests模块调用API。在邮递员上,返回的响应标头中的Content-Type是application/json;charset=utf-8,响应json数据是我期望的样子。但是,在python上的API的get方法之后运行response.json()会抛出错误simplejson.errors......
  • Python 中的“样板”代码?
    Google有一个Python教程,他们将样板代码描述为“不幸的”,并提供了以下示例:#!/usr/bin/python#importmodulesusedhere--sysisaverystandardoneimportsys#Gatherourcodeinamain()functiondefmain():print'Hellothere',sys.argv[1]#Command......
  • Python 3.9.1 中的 collections.abc.Callable 是否有 bug?
    Python3.9包含PEP585并弃用typing模块中的许多类型,转而支持collections.abc中的类型,现在它们支持__class_getitem__例如Callable就是这种情况。对我来说,typing.Callable和collections.abc.Ca......
  • 列表子类的 Python 类型
    我希望能够定义列表子类的内容必须是什么。该类如下所示。classA(list):def__init__(self):list.__init__(self)我想包含键入内容,以便发生以下情况。importtypingclassA(list:typing.List[str]):#Maybesomethinglikethisdef__init__(self):......
  • Python 中类型友好的委托
    考虑以下代码示例defsum(a:int,b:int):returna+bdefwrap(*args,**kwargs):#delegatetosumreturnsum(*args,**kwargs)该代码运行良好,只是类型提示丢失了。在Python中使用*args,**kwargs来实现​​委托模式是很常见的。如果有一种方法可......
  • 使用 python 支持构建自定义 vim 二进制文件
    背景Debian11vim软件包不包含python3支持。请参阅标题为“Debian11vim中不支持python-证据”的部分下面我需要vim支持python3YouCompleteMevim插件为了构建一个新的,我将vim9.0tarball下载到v......