2017-04-07 95 views
0

随着未来代码:我不明白struct.unpack

shmem = mmap.mmap(0, 20, "MumbleLink", mmap.ACCESS_READ) 
print("size: "+str(struct.calcsize("IL3f3f3f512s3f"))) 
print(struct.unpack("IL3f3f3f512s3f", shmem)) 

我得到这样的输出:

size: 568 
Traceback (most recent call last): 
    File "C:\Users\Saelyth\Desktop\test.py", line 8, in <module> 
    print(struct.unpack("IL3f3f3f512s3f", shmem)) 
struct.error: unpack requires a bytes object of length 568 

为什么它告诉我,它需要的长度,如果568的对象calcsize说它已经是568了?

此外,值得一提的是我一直在使用Google(和检查This)对于什么是IL3f3f3f512s3f或答案你怎么能创建自己的字符串读取的存储器,例如1024,而不是568,而是使远远没有运气。关于这部分结构工程如何帮助的详细答案,或者指出我如何理解如何计算我需要用来解压缩shmem的字符串的正确方向。

这个和This问题有关。

+0

什么版本的Python? Py2将mmap作为字符串处理,Py3作为bytearrays –

回答

1

您只检查输出的大小,该大小不适用于您的内存映射。因此,将您的第一行更改为:

shmem = mmap.mmap(0, 568, "MumbleLink", mmap.ACCESS_READ); 

它与struct的大小相匹配。如果你愿意,你可以先得到大小,然后创建内存映射来匹配它(第二个参数)。

+0

您是对的,我正在运行,想知道结构有什么问题,并忘记了mmap部分。谢谢。 – Saelyth