Python 返回的 ctypes c_char_p 已损坏
Python ctypes returned c_char_p is corrupted
我有一个包含以下内容的 C++ 接口:
extern "C"
{
char const* getValForEntry(Entry e)
{
std::string no_val = "__err::no_val";
if (handles.find(e) != handles.end())
{
std::string val = handles[e]->get_value();
return val.c_str();
}
else
return no_entry.c_str();
}
}
我有一个 python 应用程序使用 ctypes 连接到此接口,如下所示:
self.lib.getUpdateForEntry.restype = c_char_p
val = self.lib.getUpdateForEntry(e)
接口returns字符串:
{"RVC HR1":{"Mode":1,"Seq Num":162,"Home":7,"Time":"Thu Sep 01 10:00:00 2000","Flags":0,"Data Len":1024,"Data":[26, ... an array of 1024 values ... ,239]}}
python 应用看到的是:
p??"Mode":1,"Seq Num":162,"Home":7,"Time":"Thu Sep 01 10:00:00 2000","Flags":0,"Data Len":1024,"Data":[26, ... an array of 1024 values ... ,239]}}
该消息应该是一个包含 2844 个字符的字符串,但在 python 中,前 12 个字符总是损坏的,我看到消息:
'utf8' codec can't decode byte 0xb1 in position 1: invalid start byte
如果我将消息调整为数组中只有少量值(10 个以下),则消息没有问题,但是当我添加更多值时,消息的第一部分会损坏。有谁知道我为什么看到这个?是否有最大 c_char_p 长度,或者它是否作为 ascii 返回并转换为 unicode?还是别的什么?
请参阅上面的 Paul McKenzie 和用户 4581301 评论以获取解释。局部变量 val 超出范围,导致未定义的行为。
我有一个包含以下内容的 C++ 接口:
extern "C"
{
char const* getValForEntry(Entry e)
{
std::string no_val = "__err::no_val";
if (handles.find(e) != handles.end())
{
std::string val = handles[e]->get_value();
return val.c_str();
}
else
return no_entry.c_str();
}
}
我有一个 python 应用程序使用 ctypes 连接到此接口,如下所示:
self.lib.getUpdateForEntry.restype = c_char_p
val = self.lib.getUpdateForEntry(e)
接口returns字符串:
{"RVC HR1":{"Mode":1,"Seq Num":162,"Home":7,"Time":"Thu Sep 01 10:00:00 2000","Flags":0,"Data Len":1024,"Data":[26, ... an array of 1024 values ... ,239]}}
python 应用看到的是:
p??"Mode":1,"Seq Num":162,"Home":7,"Time":"Thu Sep 01 10:00:00 2000","Flags":0,"Data Len":1024,"Data":[26, ... an array of 1024 values ... ,239]}}
该消息应该是一个包含 2844 个字符的字符串,但在 python 中,前 12 个字符总是损坏的,我看到消息:
'utf8' codec can't decode byte 0xb1 in position 1: invalid start byte
如果我将消息调整为数组中只有少量值(10 个以下),则消息没有问题,但是当我添加更多值时,消息的第一部分会损坏。有谁知道我为什么看到这个?是否有最大 c_char_p 长度,或者它是否作为 ascii 返回并转换为 unicode?还是别的什么?
请参阅上面的 Paul McKenzie 和用户 4581301 评论以获取解释。局部变量 val 超出范围,导致未定义的行为。