当我用ctypes读取二进制数据时,它无法正常工作。
二进制数据
03 00 00 00 49 7B 00 00 00 00 00 00
python代码
from ctypes import *
class DataStructure(Structure):
_fields_ = [
("long1", c_ulong),
#("long2", c_ulong),
("longlong", c_ulonglong)
]
binaryfile = "./ULongLong"
f = open(binaryfile, "rb")
mystruct = DataStructure()
f.readinto(mystruct)
if __name__ == "__main__":
print mystruct.long1
#print mystruct.long2
print mystruct.longlong
结果
3
0
但是当我读取二进制数据而不取消注释python代码时,它工作正常。
03 00 00 00 03 00 00 00 49 7B 00 00 00 00 00 00
结果
3
3
31561
这似乎是一个错误。有人可以帮我解决这个问题吗? 任何建议都将受到如此多的赞赏。
环境: Windows 7 x64 Python 2.7 x32 ctypes 1.1.0
答案 0 :(得分:1)
据我了解,您在使用structure packing时遇到了麻烦。看起来您的代码正在阅读" 03 00 00 00 49 7B 00 00" (字长 - 64位)但仅使用前4个字节" 03 00 00 00"。
更新:根据eryksun,上述分析是正确的。只需在DataStructure的定义中设置_pack_ = 1
。
一些使用C代码进行试验:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
struct data_structure {
uint32_t long1;
uint64_t longlong;
};
int main(int argc, char const *argv[])
{
FILE *fd, *other_fd;
struct data_structure my_struct;
my_struct.long1 = 3;
my_struct.longlong = 31561;
fd = fopen("ULongLong", "wb");
if (!fd)
{
printf("Unable to open file!");
return 1;
}
fwrite(&my_struct, sizeof(struct data_structure), 1, fd);
fclose(fd);
exit(0);
}
编译并运行后,检查了ULongLong
文件:
$ hexdump ULongLong
00000000 0300 0000 0000 0000 497b 0000 0000 0000
00000010
有时你可以在第5到第8个字节中得到一些垃圾:
$ hexdump ULongLong
00000000 0300 0000 ff7f 0000 497b 0000 0000 0000
00000010
$ hexdump ULongLong
0000000 0003 0000 7fff 0000 7b49 0000 0000 0000
0000010
这个二进制文件是否正确?