如何获取转换为字符串的 python 列表,并在 C++ 中分配给结构中的属性
How to get a python list that is converted to a string, assigned to attributes in a struct in C++
好的,我正在编辑我的原创 post。抱歉之前不够清楚。我是开发人员角色的新手,特别是 C、C++、Python 和嵌入式 Linux.
有一个 python 列表 plist = [2,434]
此数据被发送到另一个使用套接字编程用 C++ 编写的程序。
plist = str(plist)
sock = socket.socket(socket.AF_INET, socket.SOCK_STRREAM)
sock.connect(('localhost',12345))
sock.send(plist.encode('utf-8'))
sock.close()
现在 C++ 程序以字符串形式接收此数据。
我刚刚制作了一个示例字符串,如下所示,让您了解我在 C++ 端得到的结果。
const char* construct= "[2,434]";
现在我尝试将两个数字 2 和 434 分别分配给 playerType
和 playerID
,它们是以下名为 [=48= 的结构的一部分].
typedef enum
{
START,
STOP,
PAUSE,
RECORD
}PLAYER_TYPE;
typedef struct
{
PLAYER_TYPE playerType;
unsigned long playerID;
}PLAYER_HEADER;
到目前为止,我已经尝试过这种方法,我将字符串类型转换为结构类型。
PLAYER_HEADER* p= (PLAYER_HEADER* ) construct;
player = p->playerType;
cout<<(char)player<<endl;
但是这只打印了 '[' 这是 [2,434]
的第一个字符
我想知道为什么会这样。
有什么方法可以获取其余数据吗?
我知道我已经被塑造成一个角色了。
我的最终目标是将这两个数字分配给 playerType
和 playerID
.
还有其他方法吗?还是我需要太了解 C++ 中的概念才能解决这个问题?
C++ 是一种功能强大的语言,但这种能力的一部分是让你做一些不“正确”的事情。您尝试将 char *
转换为 PLAYER_HEADER*
的方式并不像您期望的那样有效。您需要解析 字符串,忽略不需要的部分并将保留的部分转换为正确的数据类型。
一种方法是使用 std::stringstream
:
PLAYER_HEADER player;
std::istringstream ss(construct);
int temp;
ss.ignore(100, '['); // Skip [
if (ss >> temp) {
player.playerType = (PLAYER_TYPE)temp;
ss.ignore(100, ','); // Skip ,
if (ss >> player.playerID) {
// Success. Do something.
}
}
另一个选项是正则表达式:
PLAYER_HEADER player;
std::smatch match;
std::regex re(R"(\[(\d+),(\d+)\])");
std::string construct_str(construct);
if (std::regex_search(construct_str, match, re)) {
playerType = (PLAYER_TYPE)std::stoi(match[1]);
playerID = std::stoi(match[2]);
// Success. Do something.
}
还有其他方法,但重点是你需要了解为什么你的转换不起作用。使用您的代码:
PLAYER_HEADER* p= (PLAYER_HEADER* ) construct;
player = p->playerType;
cout<<(char)player<<endl;
p
指向 "[2,434]"
中的第一个字符,即 [
。然后 playerType
很可能在结构中有一个 0
的偏移量,所以 player
也最终指向 [
。然后,当您将其打印为 char
时,您会得到 [
.
好的,我正在编辑我的原创 post。抱歉之前不够清楚。我是开发人员角色的新手,特别是 C、C++、Python 和嵌入式 Linux.
有一个 python 列表 plist = [2,434]
此数据被发送到另一个使用套接字编程用 C++ 编写的程序。
plist = str(plist)
sock = socket.socket(socket.AF_INET, socket.SOCK_STRREAM)
sock.connect(('localhost',12345))
sock.send(plist.encode('utf-8'))
sock.close()
现在 C++ 程序以字符串形式接收此数据。 我刚刚制作了一个示例字符串,如下所示,让您了解我在 C++ 端得到的结果。
const char* construct= "[2,434]";
现在我尝试将两个数字 2 和 434 分别分配给 playerType
和 playerID
,它们是以下名为 [=48= 的结构的一部分].
typedef enum
{
START,
STOP,
PAUSE,
RECORD
}PLAYER_TYPE;
typedef struct
{
PLAYER_TYPE playerType;
unsigned long playerID;
}PLAYER_HEADER;
到目前为止,我已经尝试过这种方法,我将字符串类型转换为结构类型。
PLAYER_HEADER* p= (PLAYER_HEADER* ) construct;
player = p->playerType;
cout<<(char)player<<endl;
但是这只打印了 '[' 这是 [2,434]
的第一个字符我想知道为什么会这样。 有什么方法可以获取其余数据吗?
我知道我已经被塑造成一个角色了。
我的最终目标是将这两个数字分配给 playerType
和 playerID
.
还有其他方法吗?还是我需要太了解 C++ 中的概念才能解决这个问题?
C++ 是一种功能强大的语言,但这种能力的一部分是让你做一些不“正确”的事情。您尝试将 char *
转换为 PLAYER_HEADER*
的方式并不像您期望的那样有效。您需要解析 字符串,忽略不需要的部分并将保留的部分转换为正确的数据类型。
一种方法是使用 std::stringstream
:
PLAYER_HEADER player;
std::istringstream ss(construct);
int temp;
ss.ignore(100, '['); // Skip [
if (ss >> temp) {
player.playerType = (PLAYER_TYPE)temp;
ss.ignore(100, ','); // Skip ,
if (ss >> player.playerID) {
// Success. Do something.
}
}
另一个选项是正则表达式:
PLAYER_HEADER player;
std::smatch match;
std::regex re(R"(\[(\d+),(\d+)\])");
std::string construct_str(construct);
if (std::regex_search(construct_str, match, re)) {
playerType = (PLAYER_TYPE)std::stoi(match[1]);
playerID = std::stoi(match[2]);
// Success. Do something.
}
还有其他方法,但重点是你需要了解为什么你的转换不起作用。使用您的代码:
PLAYER_HEADER* p= (PLAYER_HEADER* ) construct;
player = p->playerType;
cout<<(char)player<<endl;
p
指向 "[2,434]"
中的第一个字符,即 [
。然后 playerType
很可能在结构中有一个 0
的偏移量,所以 player
也最终指向 [
。然后,当您将其打印为 char
时,您会得到 [
.