在 Python 中使用动态数组反序列化 C 结构



我最近继承了一个项目,我们反序列化了一堆我无法更改的系统写出的数据(希望他们使用标准序列化程序,但我无法更改(。在大多数情况下,我能够使用 ctypes 来表示结构并将数据直接转换为 Python,但我们在某些情况下底层数据结构一团糟(同样,无论我尝试多少,我都无法更改(。让我发疯试图找到有效方法的 2 种情况是当 c 结构定义如下时:

简单案例:

struct b{
  int data;
  int more_data;
};
struct a{
  int num_entries;
  b* data;
}; 

当它被序列化时,将 b* 数据打包到内存中,就好像它是静态数组减速一样。

这是我必须处理的最可怕的情况:

struct c{
  int a;
  int b;
};
struct b{
  int random_data;
  c* data;
  int more_data;
};
struct a{
  int len; // This actually defines the length in struct b for "data" array size
  b nested_data;
  c why_not_it_is_this_poorly_organized;
}

任何帮助肯定会不胜感激!

你试过查看 Python 位串 API 吗?从这里,您可以编写一些方法,通过切片数组来反序列化数据。它可能看起来像这样:

def parse_c(buffer):
    # Parse data into list
def parse_b(buffer):
    # Parse first int of B
    list = parse_c(buffer[8:-8]) # skip first/last int
    # Parse last int of B
def parse_a(buffer):
    # Parse len (you could also pass this into parse_b, but b can figure it out from the size)
    b = parse_b(buffer[-8:-16])
    c = parse_c(buffer[-16:])

相关内容

  • 没有找到相关文章

最新更新