从C代码序列化数组数据,在Python中反序列化

az31mfrm  于 2023-04-28  发布在  Python
关注(0)|答案(2)|浏览(227)

我需要从C代码中存储密集数组数据(3D数组),然后将它们读入NumPy数组(在另一个应用程序中)。数据是大约100千字节的浮点值,C数组作为数据的指针。我正在寻找一个解决方案,不需要任何外部依赖,可以实现与最少的努力。
有什么好的解决方案吗?
谢谢。

rks48beu

rks48beu1#

我做了一些ARM设备和网络的序列化,我很乐意分享我的经验,因为你喜欢二进制序列化。我正在使用联合来序列化。让我们假设你有一个结构体,它包含一些元素,数据和指针,并且它包含家庭成员的数据:

struct fam_member
{
    char name [ MAX_NAME_LEN + 1 ];
    int height;
    age_bracket_t age_bracket;
    fam_member_t* mother;
    fam_member_t* father;
}fam_member_t;

年龄段是枚举:

typedef enum age_bracket
{
    under_18 = 0 , from_18_to_25 = 1 , from_26_to_40 = 2  , over_40 = 3
}age_bracket_t;

主要的问题和最常见的错误是结构填充,而不是认真对待这一点。如果有人不熟悉这个问题,Here是一个很好的开始。我的简单解决方案是将数据从一个字节流到另一个字节(或位流到位),对序列化的数据做你需要做的事情(即:即通过套接字发送它们)并在最后进行反序列化。我这样定义一个联盟:

typedef union serialized_struct
{
    fam_member_t family_member;
    unsigned char data[ (MAX_NAME_LEN + 1 ) + (sizeof(int)*3) ];

}serialized_struct_t;

(A few think about union here)联合的目的是通过使用相同的内存区域在不同的时间存储不同的对象来保存内存。在这个例子中,这将帮助我们并实际上免费序列化家族对象结构。
这里有一个函数,它序列化一个家族成员的数组(如果你能做一个区域,single将是小菜一碟。这就是为什么我在这里选择了一个数组)。

int serialize_array(fam_member_t* people , char* message , int elements)
{
    if((people == NULL ) || (message == NULL) || (elements < 1))
    {
        return -1;
    }
    int size = sizeof(fam_member_t);
    int i;
    for(i=0 ; i < elements ; i++)
    {
        serialized_struct_t x;
        memcpy((x.family_member.name) , people[i].name , MAX_NAME_LEN);
        x.family_member.age_bracket = people[i].age_bracket;
        x.family_member.height = people[i].age_bracket
        x.family_member.mother = people[i].mother;
        x.family_member.father = people[i].father;
        memcpy ( (message + (size * i)) , x.data , size );
    }
    return 0;
}

在这里,我们初始化位于并集中的结构中每个成员的每个数据。消息保存序列化数据。这是反序列化的函数,它将执行相反的操作

int desirialize_array(fam_member_t* people , char* message , int elements)
{
    if((people == NULL ) || (message == NULL) || (elements < 1))
    {
        return -1;
    }
    int size = sizeof(fam_member_t);
    serialized_struct_t y;
    int i;

    for (i =0 ; i < elements ; i ++ )
    {
        memcpy ( y.data , (message + (size * i)) , size );
        memcpy ( people[i].name , y.family_member.name , MAX_NAME_LEN);
        people[i].age_bracket = y.family_member.age_bracket;
        people[i].height = y.family_member.height;
        people[i].mother = y.family_member.mother;
        people[i].father = y.family_member.father;
    }
    return 0;
}

这是C中的序列化和反序列化示例。对于你需要在python中反序列化的情况,我认为如果你弄清楚序列化的含义,那就很容易了。@ Alexandria Tolkachev说的JSON可能是一个解决方案。我希望这个简化的例子对你有帮助。

qgelzfjb

qgelzfjb2#

此仓库包含您需要的内容!
https://github.com/souzomain/Packer

from Packer import Packer, Parser
packer = Packer()
packer.add_str("hello world")
print(f"packet size: {packer.get_size()} | packet: {packer.get_buffer()}")

相关问题