read(n)函数返回少于n个字节且未达到EOF

时间:2015-12-12 14:18:06

标签: python python-2.7 parsing

我正在尝试解析一个文件,但我遇到了以下问题:从文件中读取DWORD时,我只能读取1个字节而不是4个字节,并且EOF 命中

address_of_functions = []    
DWORD = "<I"
size_dword = struct.calcsize(DWORD)
f.seek(rva2fa(export_directory.AddressOfFunctions, section_header,nt_header.FileHeader.NumberOfSections), 0)
    for i in range(export_directory.NumberOfFunctions/2):
        buffer = f.read(size_dword)
        buffer1 = f.read(size_dword)
        print i, len(buffer)
        print i, len(buffer1)
        address_of_functions.append(struct.unpack(DWORD, buffer)) 

这是我遇到问题的输出照片: enter image description here

为什么长度为1的字符串会出现?我知道我可以阅读整个清单。

修改 NumberOfFunctions是1364,所以不是这样。 我要解析的文件是kernel32.dll,因此不应该有不需要的EOF。

1 个答案:

答案 0 :(得分:0)

如果文件是二进制文件 - 也就是说,它可能包含任何值的字节,而不仅仅是可打印的字符 - 您必须以二进制模式“rb”打开它。

在Windows上尤其如此,因为如果以文本模式打开文件,如果底层系统库读取函数看到一个值为26(十六进制0x1A)的字节,则会报告EOF,这对应于Ctrl-Z

以二进制模式打开文件可以避免这种不便和其他不便。