【问题标题】:Hex string to ASCII conversion with errors?十六进制字符串到 ASCII 转换有错误?
【发布时间】:2018-05-26 07:08:45
【问题描述】:

我正在尝试编写一个 python 脚本来将十六进制字符串转换为 ASCII 并将结果保存到 .der 证书格式的文件中。我可以使用转换插件在 Notepad++ 中执行此操作,但我想找到一种方法在命令行中的 python 脚本中执行此转换,方法是调用 notepad++ NppConverter 插件或使用 python 模块。

我在其中的一部分,但我的转换与 notepad++ 中看到的 ASCII 输出不同,下面是 Notepad++ 中输出的 sn-p

但我的 python 转换在下面显示的输出略有不同

如您所见,我的脚本导致输出中缺少字符,老实说,我不知道为什么某些块用黑色勾勒出来。但是这些缺失的块需要以与第一张图片相同的格式。

这是我的基本代码,我在 Python 3 中工作,我正在使用反斜杠替换错误控件,因为这是让有问题的十六进制出现在输出文件中的唯一方法

result = bytearray.fromhex('380c2fd6172cd06d1f30').decode('ascii', 'backslashreplace')

text_file = open("C:\Output.der", "w")
text_file.write(result)
text_file.close()

任何指导将不胜感激。

【问题讨论】:

  • 你能提供一个输入示例吗?
  • 那些黑色字符看起来像是非 ASCII 字符(或 ASCII 控制码)。这是chart
  • 我已经调整了原始问题以包含给定输出图片的十六进制字符串,谢谢。
  • @martineau,同意这是我最初的理解,但我想它更多的是围绕格式,如果我可以让 notepad++ 以与使用它的插件相同的方式显示 python 脚本输出,那么我我相信生成的证书文件会起作用。
  • 当我运行你的代码时,我得到一个包含十六进制字节 38 0C 2F 5C 78 64 36 17 2C 5C 78 64 30 6D 1F 30 的输出文件。希望输出是什么?我不在乎它在某些文本编辑器中是什么样子,比如 notepad++ 或其他任何东西——这正是你想要的文件。顺便说一下,这两个5C 78 子字符串分别代表\x 前缀。

标签: python python-3.x hex ascii


【解决方案1】:

MikG,我想说 python 完全按照你的要求做了。

您告诉将字节转换为字符串,并用转义序列设置的最高有效位替换字节(\xFF 字符除外)。

字符 \x04 (ETB) 和 \x1F (US) 是完全合法的 ASCII 字符(尽管不可打印),并且使用它们的字面值进行编码。

字符 \xd6 和 \xd0 在 ASCII 中是非法的 - 它们是 8 位长。正如您所问的,它们使用 4 个字母的长转义序列进行编码:“\”(反斜杠字符)和“xd6”/“xd0”字符串

我不擅长使用 DER,但假设您希望拥有原始的 8 位序列。这是如何实现的:

result = bytearray.fromhex('380c2fd6172cd06d1f30')

with open("Output.der", "wb") as text_file:
    text_file.write(result)

请注意 open 的“wb”说明符——它告诉 python 进行二进制 IO。

我还使用了with 语句来确保text_file 在写入时关闭。

【讨论】:

  • 如此接近!您的解决方案几乎就在那里,我现在只是缺少 NUL 块(类似于图中的黑色块),而是在 Notepad++ 中打开时在输出中得到一个空格。可以通过在原始十六进制字符串中添加 00 来添加 NUL。
  • @MikG 我对 NUL 字符没有任何问题。
  • @MikG 这是用于查看 DER 文件的文本编辑器的功能。它最多读取第一个 NUL 字符。请改用十六进制编辑器。或者只是检查输出文件的大小。我在 Linux python 3.6 中尝试过 - 它工作正常。
  • 感谢@PakUula,您是正确的,NUL 条目在那里。我将输出复制并粘贴到与 Notepad++ 生成的转换相同的文本编辑器窗口中,以进行视觉比较,由于某种原因,NUL 条目在粘贴时被省略,但它们存在于从您的脚本创建的文件中,非常感谢您帮助。
猜你喜欢
  • 2015-05-22
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
  • 2014-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多