gpt4 book ai didi

Python ctypes 与 io.readinto 不能很好地工作

转载 作者:太空宇宙 更新时间:2023-11-03 18:20:48 24 4
gpt4 key购买 nike

当我使用 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 x64Python 2.7 x32ctypes 1.1.0

最佳答案

据我了解,您遇到了 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

这个二进制文件正确吗?

关于Python ctypes 与 io.readinto 不能很好地工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24185502/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com