【问题标题】:Nul byte representation in PythonPython中的Nul字节表示
【发布时间】:2017-03-11 20:31:27
【问题描述】:

我有一个疑问,我很难理解代码的样子,所以我会尽力解释。我正在尝试查看和搜索 NUL 字节并将其替换为另一个 NUL 类型字节,但计算机需要能够区分不同 NUL 字节之间的区别。例如,十六进制代码 00 等于 NUL,十六进制代码 01 等于 SOH。假设我想创建代码来相互替换它们。代码示例

TextFile1 = Line.Replace('NUL','SOH') TextFile2.write(TextFile1)

是的,我已经阅读了很多不同的帖子,只是想了解如何将其放入工作代码中。第一个问题是我不能将十六进制 00 的输出复制并粘贴到它不会粘贴的 python 模块中。阅读显示 0x00 类型格式用于表示,但我在为 python 3.x 找到正确表示时遇到问题

打印 (\x00) output = nothing shows #I'm trying to get output of 'NUL' or as hex will show '.'要么工作正常——编辑

那么如何让模块理解我正在尝试表示 HEX 00 或“NUL”并表示为“。”并为 SOH 做同样的事情,不仅限于这些类型的 NUL 字符,而且只是将它们用作示例,因为我想使用所有 256 个 HEX 字符。但能够像十六进制编辑器那样在粘贴到另一个程序时分辨出区别。也许我需要让这两个程序使用相同的编码类型并不确定。我只需要一个非常简单的示例文本,作为我将如何搜索和替换不可表示的十六进制字符并在记事本或记事本++中查找和替换它们的方法,根据我的阅读,只有记事本++有能力这样做。

【问题讨论】:

  • 'NUL' 只是字符串'NUL'0x00 是十六进制的数字0。你的意思是'\x00'
  • 是的,我确实找不到正确的编码,或者使用所有 256 个十六进制选项创建一个简单的查找和替换函数可能是什么。因为有些选项不能按常规显示。那么我该如何解决这个问题。让 python 和 notepad++ 都明白什么是什么。

标签: python python-3.x nul


【解决方案1】:

如果您使用的是 Python 3,那么您真的应该使用 bytes 对象。 Python 3 字符串是 unicode 代码点的序列。要使用字节字符串,请使用bytes(这与使用“字节序列”模型的 Python 2 字符串几乎相同)。

>>> bytes([97, 98, 99])
b'abc'
>>>

注意,要编写 bytes 文字,请在字符串的开头引号之前添加 b

要回答您的问题,要找到0x000x01 的表示形式,请看:

>>> bytes([0x00, 0x01])
b'\x00\x01'

注意,0x000 是同一类型,它们只是文字语法不同(十六进制文字与十进制文字)。

>>> bytes([0, 1])
b'\x00\x01'

我不知道你说的 Notepad++ 是什么意思。

下面是一个用其他东西替换空字节的例子:

>>> byte_string = bytes([97, 98, 0, 99])
>>> byte_string
b'ab\x00c'
>>> print(byte_string)
b'ab\x00c'
>>> byte_string.replace(b'\x00', b'NONE')
b'abNONEc'
>>> print(byte_string.replace(b'\x00', b'NONE'))
b'abNONEc'

【讨论】:

  • ok 尝试在 python 上显示或“打印 (\x00)” 没有显示。尝试在十六进制编辑器或个人十六进制应用程序上查看 00 的十六进制代码,无论您选择什么。你会得到一个代表字符'。'或在记事本 ++ 上,您将得到一个“NUL”,我正在尝试创建将这些 NUL 字符替换为另一个 NUL 字符的应用程序。
  • 所以@LookingForAnswer 您是否只寻找0x00 或任何不可可打印 在这种情况下您可能想要使用类似"\x00".isprintable()
  • 十六进制编辑器不只是神奇地显示一个“。”它遍历字节并打印由程序计算的它们的表示。更改字节,重新计算并显示。这是他们的逻辑。他们看到一个不可打印的,他们输出一个空格。他们看到 97 的十六进制,他们打印一个 'a' 。我不知道python,但伪代码是if (!char.is_printable) then print(replacementDict[char]) else print(char)
  • 如果您要复制“.”从十六进制编辑器来看,很可能发生的是编辑器捕获了 control-c 或有自己的复制命令,该命令实际上复制了真实的表示,而不是“。”当您从记事本中复制并粘贴回十六进制编辑器时,它会再次即时执行数据计算。听起来你混淆了很多东西。这里没有您可以遵循的平台。有字节以及它们如何显示
  • 不,因为就像我说的我不知道 python,但更多是因为你所要求的没有任何意义
【解决方案2】:

在python中获取\x00值的另一种等效方法是chr(0),我喜欢这种方式比文字版本好一点

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 2019-03-12
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    相关资源
    最近更新 更多