我有一个文件,包含小端格式的无符号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
我一直在研究如何使用结构,因为它似乎就是为它制作的,但我一直无法使用它们找到正确的语法。
非常感谢任何帮助!
答案 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
那就是它。