从文件中读取小端并转换为十进制

时间:2014-07-25 23:20:06

标签: python python-2.7

我有一个文件,包含小端格式的无符号64位整数,如下所示

0100 0000 0000 0000 
0200 0000 0000 0000 
0300 0000 0000 0000 
3655 9d80 0f00 0000 
7a64 dae3 0900 0000 
060f fa3f 0600 0000

我正在寻找一种方法来读取这些数字,然后将它们转换为十进制等效数

我到目前为止的代码如下:

filename = "C:\\RainbowTables\\md5_loweralpha-numeric#1-7_0_2x50_0.rt"
blocksize = 8

with open(filename, "rb") as f:
    startpoint = f.read(blocksize)
    string = ""
    for ch in startpoint:
        string += hex(ord(ch))
    print string

从第一个数字

给出了以下输出
0x10x00x00x00x00x00x00x0

我一直在研究如何使用结构,因为它似乎就是为它制作的,但我一直无法使用它们找到正确的语法。

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:2)

import struct
decoded = []
with open("some_bin_file.rt","rb") as f:
     while True:
          try: 
             decoded.append(struct.unpack_from("<Q",f)[0])
             # `<` means little endian; `Q` means unsigned long long (8 bytes)            
          except struct.error:
             break

print decoded

我认为应该工作......

答案 1 :(得分:2)

关键是struct模块 - 特别是struct.unpack - 就像Joran Beasley解释的那样。

因此,循环遍历您的文件,一次读取8个字节,直到结束:

filename = "C:\\RainbowTables\\md5_loweralpha-numeric#1-7_0_2x50_0.rt"
blocksize = 8

with open(filename, "rb") as f:
    while True:
        buf = f.read(blocksize)
        if not buf:
            break

...将每个8字节解压缩为一个小端64位无符号int:

        value = struct.unpack('<Q', buf)

...用每个号码做你想做的事 - 也许把它添加到列表中?...但是现在让我们把它打印出来:

        print value

......你已经完成了。

答案 2 :(得分:1)

根据这条评论:

  

它现在正在工作,但我不确定它是否给了我正确的输出(或者至少是我预期的输出)假设文件的前8个字节是代码在0100 0000 0000 0000中,因为它在小端,我认为这应该是普通十六进制中的0000 0000 0000 0001。标准小数为1。但是当我使用两个答案运行它时,我得到以下输出 - 3472328296227680560L, 3472328296227680304L

我愿意打赌你的文件格式错了。看看这个:

>>> hex(3472328296227680560L)
3030303030303030

现在,十六进制30是字符'0'的ASCII。正如您所看到的,只需重新打包解压缩的数据:

>>> struct.pack('<Q', 3472328296227680560L)
'00000000'

这足以告诉我们该文件几乎肯定是一系列编码为ASCII十六进制的64位数字。仅仅告诉我们他们是否以任何方式分离是不够的。您必须查看要查看的文件。 (如果您无法在编辑器中或使用cat / type等来弄清楚如何执行此操作,只需print f.read(100)并在此处发布结果,其他人可以告诉您你。)

但是我们假设ASCII十六进制数字是以空格分隔的。那么,你想要的是:

with open(path) as f:
    for line in f:
        hexnumbers = line.split()
        for hexnumber in hexnumbers:
            number = int(hexnumber, 16)
            print number

那就是它。