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

时间:2018-11-19 12:54:22

标签: python c numpy serialization

我需要存储来自C代码的密集数组数据(3D数组),然后将它们读入NumPy数组(在另一个应用程序中)。数据是大约100 KB的浮点值,C数组是指向数据的指针。我正在寻找一种不需要任何外部依赖关系并且可以最省力地实现的解决方案。

有什么好的解决方案?

谢谢。

1 个答案:

答案 0 :(得分:0)

我已经对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) 合并的目的是通过使用相同的内存区域在不同的时间存储不同的对象来节省内存。在此示例中,这将帮助我们并实际上免费地序列化族对象结构。

这是一个对一系列家庭成员进行序列化的函数(如果可以做一个区域,单身将是小菜一碟,这就是为什么我在这里选择一个数组)。

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;
}

在这里我们初始化位于联合体中的struct内部每个成员的每个数据.Message保存序列化的数据。这是反序列化的函数,将执行相反的操作

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中反序列化的情况,我认为如果弄清楚这将是序列化的意思将很容易。例如@Alexander Tolkachev所说的JSON可以成为解决方案。 我希望这个简化的示例对您有所帮助。