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

时间:2014-11-13 19:49:32

标签: python c

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

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中的unsigned char数组中。

我已尝试将十六进制值加载到python中并删除所有空格,然后通过每个其他字符设置一个空格,以便将它们表示为单个字节。但无论我怎样都不能改变十六进制值的布局。

这是代码

    with open ("yes.txt", "r") as myfile:
        byte=myfile.read().replace('\n', '').replace(' ','')

    [byte[i:i+2] for i in xrange(1,len(byte))]

    print byte

打印字节

有人可以帮帮我吗。

提前致谢

2 个答案:

答案 0 :(得分:3)

假设您要从文件中读取值并以新格式将其写回 也就是说,来自内容文件" ff00 928a"获取一个内容为" 0xff 0x00 0x92 0x8a"的新文件 这段代码可以解决问题:

with open("vals.txt") as f:
    hexVals = f.read()

with open("out.txt", "w") as g:
    for val in hexVals.split(): 
        g.write('0x' + val[:2] + " ")
        if(len(val) > 2):
            g.write('0x' + val[2:]  + " ")

EDIT
如果文件是二进制文件(当你打印f.read()时,你看不到你给出的值,但它们在ascii中代表的是什么,你可以做到

from binascii import hexlify
hexVals = hexlify(f.read())

看看是否打印这个给你一个字符串,其中包含数据的十六进制表示。 当然,如果需要,您可以使用unhexlify从同一模块转换回来。

答案 1 :(得分:2)

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

但是,它确实存在一些问题:你返回每对字符,1-2,然后是2-3,然后是3-4。您希望使用step参数来确保范围是不同的对,而不是重叠对。你想从0而不是1开始,所以你不要跳过第一个角色。

更重要的是,你不能任何有关该列表的内容,所以这不是非常有用。

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

pairs = [byte[i:i+2] for i in xrange(0, len(byte), 2)]

现在,您可以使用其他理解(或明确的for语句)将0x添加到每个:{/ p>

c_pairs = ['0x' + pair for pair in pairs]

然后你可以用逗号加入他们:

c_initializer = ', '.join(c_pairs)

值得注意的是,您可以在这里轻松使用生成器表达式而不是列表推导,从而节省了一点内存。您也可以将各个步骤合并在一起。*例如:

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

你可能还想在琴弦周围贴上一些支架,然后把它写在某个地方,但我会将这部分作为练习留给读者;你知道如何使用file.readstr.replace这一事实意味着你可以很容易地处理这些类似的任务。


*虽然如果你将所有步骤合并在一起,就像我一样,用生成器表达式替换单个列表理解并不能实际添加任何好处,因为如果你给str.join一个iterator它只是从中创建一个列表。