+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

如何使用ctypes打包和解压缩(Structure <-> str)

发布于2020-09-30 16:06     阅读(462)     评论(0)     点赞(21)     收藏(4)


0

1

2

3

4

这可能是一个愚蠢的问题,但我在文档或任何地方都找不到好的答案。

如果我使用struct定义二进制结构,则该结构具有2种对称的序列化和反序列化方法(打包和解包),但是ctypes似乎没有直接的方法。这是我的解决方案,感觉不对:

from ctypes import *

class Example(Structure):
    _fields_ = [
        ("index", c_int),
        ("counter", c_int),
        ]

def Pack(ctype_instance):
    buf = string_at(byref(ctype_instance), sizeof(ctype_instance))
    return buf

def Unpack(ctype, buf):
    cstring = create_string_buffer(buf)
    ctype_instance = cast(pointer(cstring), POINTER(ctype)).contents
    return ctype_instance

if __name__ == "__main__":
    e = Example(12, 13)
    buf = Pack(e)
    e2 = Unpack(Example, buf)
    assert(e.index == e2.index)
    assert(e.counter == e2.counter)
    # note: for some reason e == e2 is False...

解决方案


PythonInfo Wiki为此提供了解决方案。

常见问题解答:如何从ctypes.Structure将字节复制到Python?

def send(self):
    return buffer(self)[:]

常见问题解答:如何从Python复制字节到ctypes.Structure?

def receiveSome(self, bytes):
    fit = min(len(bytes), ctypes.sizeof(self))
    ctypes.memmove(ctypes.addressof(self), bytes, fit)

它们send(或多或少)等同于packreceiveSome有点像pack_into如果遇到“安全”情况,您要解压缩为与原始结构相同类型的结构,则可以将其单行 memmove(addressof(y), buffer(x)[:], sizeof(y))复制x到中y当然,您可能会有一个变量作为第二个参数,而不是字面量的x

0

1

2

3

4

5

6



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接: https://www.pythonheidong.com/blog/article/554730/8837b79c7921cafca89f/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

21 0
收藏该文
已收藏

评论内容:(最多支持255个字符)