1

说我有一个像

typedef struct {
    unsigned char flag, type;
    unsigned short id;
    uint32 size;
} THdr;

和来自 UDP 通信的数据缓冲区,我有一个字节缓冲区及其大小(datadata_size)。数据大小大于sizeof(THdr).

该结构位于缓冲区的开头,我想将其复制到代码中定义的结构中,THdr Struct_copy.

我知道我可以使用memcpy(&Struct_copy,data[0],sizeof(Struct_copy));,但我想使用“C++ 风格”的方式,比如使用std::copy.

任何线索?

4

2 回答 2

2

在 C++ 中没有“聪明”的方法可以做到这一点。如果它不涉及memcpy,那么您需要std::copy并且必须使用强制转换const unsigned char *来使源和/或目标的数据类型匹配。

有多种其他方法可以“复制一些数据”,例如类型双关语,但同样,这并不是一个“更好”的解决方案memcpy——只是不同而已。

C++ 旨在接受 C 代码,因此如果您当前的代码没有任何问题,那么我不明白您为什么应该更改它。

于 2013-05-10T13:47:44.807 回答
1

像这样的东西怎么样

THdr hdr;
std::copy(&hdr, &hdr + 1, reinterpret_cast<THdr*>(data));

THdr应该将一个结构从复制datahdr

它也可以更简单:

THdr hdr;
hdr = *reinterpret_cast<THdr*>(data);

这最后一个也适用于C:

THdr hdr;
hdr = *(THdr *) data;

或者为什么不创建一个将数据作为输入的构造函数?喜欢

struct THdr
{
    explicit THdr(const unsigned char* data)
        {
            THdr* other = reinterpret_cast<THdr*>(data);
            *this = *other;
        }

    // ...
};

然后可以使用如

THdr hdr(data);
于 2013-05-10T13:46:02.597 回答