Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 十六进制字符串到ASCII的转换是否有错误?_Python_Python 3.x_Hex_Ascii - Fatal编程技术网

Python 十六进制字符串到ASCII的转换是否有错误?

Python 十六进制字符串到ASCII的转换是否有错误?,python,python-3.x,hex,ascii,Python,Python 3.x,Hex,Ascii,我正在尝试编写一个python脚本,将十六进制字符串转换为ASCII,并将结果保存为.der cert格式的文件。我可以使用转换插件在Notepad++中实现这一点,但我想通过调用Notepad++NppConverter插件或使用python模块,在命令行的python脚本中找到实现这一转换的方法 我已经完成了部分转换,但我的转换与notepad++中的ASCII输出不完全相同,下面是notepad++中的输出片段 但是我的python转换在下面显示了一个稍微不同的输出 正如您所看到的,我

我正在尝试编写一个python脚本,将十六进制字符串转换为ASCII,并将结果保存为.der cert格式的文件。我可以使用转换插件在Notepad++中实现这一点,但我想通过调用Notepad++NppConverter插件或使用python模块,在命令行的python脚本中找到实现这一转换的方法

我已经完成了部分转换,但我的转换与notepad++中的ASCII输出不完全相同,下面是notepad++中的输出片段

但是我的python转换在下面显示了一个稍微不同的输出

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

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

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

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

如果您能提供任何指导,我们将不胜感激。

Migg,我想说python完全按照您的要求做了

您被告知将字节转换为字符串,并使用转义序列(除了\xFF char)将字节替换为最高有效位集

字符\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


我还使用语句来确保无论写入发生什么情况,
text\u文件
都是关闭的。

您能提供一个输入示例吗?这些黑色字符看起来像是非ASCII字符(或ASCII控制代码)。这里有一个问题,我已经调整了原始问题,使之包含给定输出图片的十六进制字符串,谢谢。@martineau,同意这是我最初的理解,但我想更多的是围绕格式,如果我能让notepad++以使用其插件的方式显示python脚本输出,然后我相信生成的cert文件会工作。当我运行代码时,我会得到一个包含十六进制字节的输出文件
38 0C 2F 5C 78 64 36 17 2C 5C 78 64 30 6D 1F 30
。您希望输出是什么?我不在乎它在一些文本编辑器中是什么样子,比如记事本++或者其他任何你想要的文件。顺便说一下,两个
5C 78
子字符串分别代表
\x
前缀。太接近了!您的解决方案几乎就是这样,我现在只是缺少NUL块(类似于图中的黑色块),而是在Notepad++中打开时,在输出中得到一个空格。可以通过在原始十六进制字符串中添加00来添加NUL。@MikG我对NUL字符没有任何问题。@MikG这是用于查看DER文件的文本编辑器的功能。它最多读取第一个NUL字符。改用十六进制编辑器。或者简单地检查输出文件的大小。我在Linux python 3.6中试过,效果很好。谢谢@PakUula,你是对的,NUL条目就在那里。我将输出复制并粘贴到与Notepad++生成的转换相同的文本编辑器窗口中,以进行视觉比较,粘贴时由于某种原因忽略了NUL条目,但它们在根据脚本创建的文件中,非常感谢您的帮助。