在 python 中匹配 C++ 结构的最佳方法?

Posted

技术标签:

【中文标题】在 python 中匹配 C++ 结构的最佳方法?【英文标题】:Best way to match a C++ struct in python? 【发布时间】:2022-01-04 21:20:07 【问题描述】:

我有一个 API 端点,它在用 C++ 编写的服务器上采用二进制结构。端点每秒必须接受数百个这样的结构,因此使用 JSON 或类似的东西有太多的开销。

结构看起来像这样:

struct TX 
    int blockId;
    char signature[64];
    char signingKey[32];
    time_t timestamp;
    char nonce[8];
    char to[25];
    char from[25];
    long amount;
    long fee;
    bool isTransactionFee;
;

我正在用 Python 编写一个客户端,它必须以上述格式提交数据。当我在 C++ 中对结构执行 sizeof 时,它给了我 200 个字节,各个字段 sizeof 的总和接近 182 个字节。

我不确定从哪里开始能够准确地序列化 python 中的结构——我是否假设结构的填充总是添加到末尾?我怎么知道两个字段之一之间没有填充?

我按照这些思路写了一些东西来开始并计划将数据复制到这些字节数组中:

    txBinary = bytearray([0]*200)
    blockId = bytearray([0]*4)
    signature = bytearray([0]*64)
    signingKey = bytearray([0]*32)
    timestamp = bytearray([0]*8)
    nonce = bytearray([0]*8)
    toWallet = bytearray([0]*25)
    fromWallet = bytearray([0]*25)
    amount = bytearray([0]*8)
    fee = bytearray([0]*8)
    isFee = bytearray([0])

这是一个理智的方法吗?有没有其他更简单的方法可以在 Python 中序列化这样的数据结构?

【问题讨论】:

【参考方案1】:

因此,经过大量的摸索,我决定最可靠的方法是使用 Python 中的 exec 来调用一个 C++ cli 应用程序,该应用程序接受事务参数并输出结构的 base64 编码版本。

最困难的挑战是我需要在交易中的字节上计算加密签名,让 C++ 和 python 版本的加密库协同工作变得很痛苦,这导致我只使用 C++ 代码库并在 Python 中调用它。

【讨论】:

以上是关于在 python 中匹配 C++ 结构的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

最佳重载方法匹配...有一些无效参数

在 C++ 中存储和搜索数字的最佳方法

cython wrap cpp 结构和函数,参数为结构数组

在 C++ 中创建嵌套列表的最佳方法是啥?

c++ 以最佳方式返回结构和向量

在 C++ 中拆分字符串的最佳实践