json 如何将填充了0x00的cython char* 转换为非空字节数组

f4t66c6m  于 2023-02-26  发布在  其他
关注(0)|答案(1)|浏览(112)

下面是一个cython函数:

cdef struct my_struct_t:
    unsigned int a
    short b
    unsigned char[6] c

cdef void f_my_struct_t(int buff_size, const unsigned char* buf, list output):
    cdef:
        my_struct_t *arr = <my_struct_t *> buf
        list data = []

    for i in range(buff_size / sizeof(my_struct_t)):
        data.append(arr[i])

    output.append({
        "type": "my_struct_t",
        "data": data
    })

此函数接受包含结构体my_struct_t的缓冲区参数,并将此结构体格式化为json格式。
在C语言中,char*只是一个字节数组。
在cython中,它被认为是一个只包含ASCII字符的数组。
因此,如果第一个元素是0x00的别名'\0',则将字节数组转换为b'',而如果char数组只包含0x00,则将其转换为b'000000'
此函数的当前结果为:

{
    'type': 'my_struct_t',
    'data': [
      {
        'a': 1,
        'b': 2,
        'c': b'' # Byte array should not be null
      }
    ]
  }
    • json.dumps(xxx, indent=4)如何使用空字节数组解析此dict?**当前if失败是因为此空字节数组(或者可能只是因为存在字节数组?)。当前错误:TypeError: Object of type bytes is not JSON serializable

如何强制cython正确地将char * 转换为字节数组?

34gzjxbg

34gzjxbg1#

1.它失败不是因为它是空的,而是因为它是字节而不是字符串,你需要通过bytes_value.decode("ascii")(或者其他你可能使用的编码)把它转换成字符串。
1.默认情况下,Cython将char数组视为C字符串,并在\0终止符处停止。您可以在强制转换时通过切片来避免这种情况:<bytes>arr.c[:6]
然而,你必须手动为char数组元素做这个,这不能作为Cython从C struct到Python dict(你现在使用的)的自动转换的一部分。
1.只包含0值的字节数组将转换为b'\0\0\0\0\0\0'(而不是您所声称的b'000000')。ASCII字符'0'未使用数值0进行编码

相关问题