qt的结构体中FUNC_POOL封装memcpy()

封装memcpy()

#define FUNC_POOL \
bool payload_cur_info(Net_Carrier *NetPak, uint32_t size = NET_CARRIER_PAYLOAD_MAX_SIZE)\
{\
    uint32_t self_size=sizeof (*this);\
    NetPak->_payload_size = sizeof(*this);\
    if(self_size<=size)\
    {\
        memcpy_s(NetPak->_payload,size,this,self_size);\
        return true;\
    }else{\
        return false;\
    }\
}\
uint32_t get_payload_size()\
{\
    return sizeof(*this);\
}

把数据存储为字符,存进字符流

//设置相机投影数据
struct topic_set_cam_projection_data
{
    uint16_t _node_id;
    TYPE_cam_projection_data CamProjectionData;//相机投影数据
 

    std::string ToString()
    {
    std::stringstream ss;
    ss << "_node_id:" << (int)_node_id << " ,";
    ss << CamProjectionData.ToString();
    return ss.str();
    }
   FUNC_POOL
};
       Net_Carrier NetPack;
        NetPack._msg_priorities = EMSG_PRIORITIY::GameNormal;
        NetPack._source_node = E_NNODE_MSG_CONVER;
        NetPack._target_node = E_NNODE_VISUAL;
        NetPack._time_stamp = time(0);
        NetPack._topic_id = E_TPC_SET_CAM_PROJECTION_DATA;
      
        topic_set_cam_projection_data sysSetting;
        sysSetting._node_id = id;
        sysSetting.CamProjectionData._enable = enable;
        sysSetting.CamProjectionData._top_clipping_angle = top;
        sysSetting.CamProjectionData._bottom_clipping_angle = bottom;
        sysSetting.CamProjectionData._left_clipping_angle = left;
        sysSetting.CamProjectionData._right_clipping_angle = right;
       
       	//把这个结构体数据拷贝到另一个结构体
        sysSetting.payload_cur_info(&NetPack);
       
        QByteArray SendData;
        int SendSize = 21+NetPack._payload_size;
        SendData.resize(SendSize);
        memcpy(SendData.data(),&NetPack,SendSize);
        SendUdpData(SendData,QHostAddress(ip),port,msgType);
### 如何在 Qt 中使用 `memcpy` 将结构体赋值给 `QByteArray` 在 Qt 中,可以使用 `memcpy` 函数将结构体的数据复制到 `QByteArray` 中。以下是一个详细的说明和示例代码。 #### 1. 结构体对齐问题 在使用 `memcpy` 将结构体数据复制到 `QByteArray` 时,必须注意结构体的内存对齐问题。如果结构体成员具有不同的大小(如 `int`、`float` 和指针类型),编译器可能会自动插入填充字节以优化内存访问速度[^1]。为了避免这种问题,可以使用 `#pragma pack(push, 1)` 和 `#pragma pack(pop)` 来强制设置结构体的内存对齐为 1 字节。 #### 2. 示例代码 以下代码展示了如何将一个包含基本数据类型和指针的结构体复制到 `QByteArray` 中,并通过 `memcpy` 恢复数据。 ```cpp #include <QCoreApplication> #include <QByteArray> #include <QDebug> #pragma pack(push, 1) typedef struct { int a; // 4 bytes float b; // 4 bytes char c; // 1 byte int *d; // 8 bytes on 64-bit systems } testStruct; #pragma pack(pop) int main() { testStruct structA; structA.a = 1; structA.b = 2.0f; structA.c = 'a'; structA.d = new int[10]; for (int i = 0; i < 10; ++i) { structA.d[i] = i; } // 创建 QByteArray 并调整大小 QByteArray arr; arr.resize(9 + 40); // 9 bytes for structA (excluding pointer) + 40 bytes for the array // 复制结构体数据到 QByteArray memcpy(arr.data(), &structA, 9); // Copy the first 9 bytes of structA memcpy(arr.data() + 9, structA.d, 40); // Copy the pointer data // 从 QByteArray 恢复结构体 testStruct *sb = reinterpret_cast<testStruct *>(arr.data()); sb->d = reinterpret_cast<int *>(arr.data() + 9); // 输出结果 qDebug() << "sb->a:" << sb->a; qDebug() << "sb->b:" << sb->b; qDebug() << "sb->c:" << sb->c; for (int i = 0; i < 10; ++i) { qDebug() << "sb->d[" << i << "]:" << sb->d[i]; } // 清理动态分配的内存 delete[] structA.d; return 0; } ``` #### 3. 注意事项 - **指针处理**:在上述示例中,结构体中的指针成员 `d` 被单独处理。需要确保在恢复结构体时正确设置指针的指向。 - **内存泄漏**:动态分配的内存(如 `new int[10]`)必须在程序结束前释放,以避免内存泄漏。 - **平台依赖性**:指针的大小可能因平台而异(例如,在 32 位系统上为 4 字节,在 64 位系统上为 8 字节)。因此,必须根据目标平台调整代码逻辑。 #### 4. 扩展功能 如果需要保存更复杂的结构体(例如嵌套结构体或包含字符串的结构体),可以考虑使用 Qt 的序列化机制(如 `QDataStream`)来替代 `memcpy`,以简化数据处理过程[^4]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值