如何获取转换为字符串的 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 分别分配给 playerTypeplayerID,它们是以下名为 [=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]

的第一个字符

我想知道为什么会这样。 有什么方法可以获取其余数据吗?

我知道我已经被塑造成一个角色了。 我的最终目标是将这两个数字分配给 playerTypeplayerID .

还有其他方法吗?还是我需要太了解 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 时,您会得到 [.