我正在尝试解析一个文件,但我遇到了以下问题:从文件中读取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))
为什么长度为1的字符串会出现?我知道我可以阅读整个清单。
修改
NumberOfFunctions是1364,所以不是这样。
我要解析的文件是kernel32.dll
,因此不应该有不需要的EOF。
答案 0 :(得分:0)
如果文件是二进制文件 - 也就是说,它可能包含任何值的字节,而不仅仅是可打印的字符 - 您必须以二进制模式“rb”打开它。
在Windows上尤其如此,因为如果以文本模式打开文件,如果底层系统库读取函数看到一个值为26(十六进制0x1A)的字节,则会报告EOF,这对应于Ctrl-Z
以二进制模式打开文件可以避免这种不便和其他不便。