在python中添加前导零到十六进制值

2024-06-02 06:23:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下十六进制值,我在一个文件中。在

ff00 928a 6275 7474 6f6e 4c69 7374 df00
84ff 002a 8869 6e70 7574 5069 6e41 0185
426e 616d 6588 4a41 4a41 4a41 4441 8672
656c 6179 73c8 4103 4103 4103 4103 ff00
2a88 696e 7075 7450 696e 4102 8542 6e61
6d65 884e 454a 4e45 4a44 4186 7265 6c61
7973 c841 0441 0441 0441 04ff 0027 8869
6e70 7574 5069 6e41 0385 426e 616d 6585
4d41 4144 4186 7265 6c61 7973 c841 0141
0141 0141 01

我想把这些十六进制值拆分成单个字节,比如ff,然后加上前导的零0x,这样我就可以把它直接放入C中的一个无符号字符数组中

我尝试过将十六进制值加载到python中并删除所有空白,然后每隔一个字符设置一个空白,以便将它们表示为单个字节。但不管怎样,我似乎不能改变十六进制值的布局。在

这是密码

^{pr2}$

打印字节

有人能帮帮我吗。在

提前谢谢


Tags: 文件密码字节符号数组布局字符空白
2条回答

假设您要从文件中读取值并以新格式将其写回 也就是说,从内容为“ff00928a”的文件中获取一个内容为“0xff 0x00 0x92 0x8a”的新文件 这段代码可以做到:

^{1}$

编辑
如果文件是二进制的(当您打印f.read()时,您看不到您给出的值,而是看到它们在ascii中表示的内容,您可以这样做

^{pr2}$

看看打印这个是否会给你一个带有十六进制数据表示的字符串。 当然,如果需要的话,你可以用unhelly从同一个模块转换回来。在

你的列表理解确实会返回一些有用的东西——每对字符的列表。在

不过,它确实有几个问题:返回的是每对字符,1-2,2-3,然后3-4。您需要使用step参数来确保范围是不同的对,而不是重叠的对。你想从0开始,而不是从1开始,这样就不会跳过第一个字符。在

更重要的是,你不会用这个列表做任何事情,所以这不是很有帮助。在

要做的第一件事是将其分配给一个变量:

^{1}$

现在,您可以使用另一个理解(或显式的for语句)将0x添加到每个语句中:

^{pr2}$

然后你可以用逗号把它们连起来:

c_initializer = ', '.join(c_pairs)

值得注意的是,在这里您可以很容易地使用生成器表达式而不是列表理解,这样可以节省一些内存。您也可以将单独的步骤合并在一起。*例如:

c_initializer = ', '.join('0x' + byte[i:i+2] for i in xrange(0, len(byte), 2))

您可能还想在字符串周围加上大括号,并在某个地方写出它,但我将把这部分留给读者练习;您知道如何使用file.read和{}这一事实意味着您可以非常轻松地处理这些类似的任务。在


*虽然像我一样,将所有步骤合并在一起,但用生成器表达式替换单个列表理解实际上并不会带来任何好处,因为如果给str.join一个迭代器,它只会从中生成一个列表。

相关问题 更多 >