下面是一个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 * 转换为字节数组?
1条答案
按热度按时间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
进行编码