如何将数据复制到字节数组的某些部分

How to copy data into certain parts of a byte array

本文关键字:些部 数组 到字节 数据 复制      更新时间:2023-10-16

我想从一个未知结构中创建一个字节数组,并在此字节数组的前面添加一个数字。我该怎么做?

我当前有此代码:

template <class T>
void CopterConnection::infoToByteArray(char *&bit_data, size_t *msglen,
                                       T data) {
    // Determine which kind of element is in the array, will change in the final code
    char typeID = -1;
    *msglen = sizeof(data);
    *msglen += 1;  // take in account of typeID
    // Create the pointer to the byte representation of the struct
    bit_data = new char[*msglen];
    // copy the information from the struct into the byte array
    memcpy(bit_data, &data+1, *msglen-1);
    bit_data[1] = typeID;
}

但这不起作用。我想我错了错误。我想将Unkown结构T复制到bit_data[1]的位置为bit_data[*end*]。实现这一目标的最佳方法是什么?

一个可能的问题和一个确定的问题:

  1. 可能的问题是数组索引从零开始。因此,您应该复制到bit_data + 1以跳过第一个字节,然后使用bit_data[0]设置类型ID。

  2. 确定的问题是&data + 1等于(&data)[1],它将超出界限并导致不确定的行为。您应该只从&data复制。

将所有内容放在一起,将最后一条线应为

memcpy(bit_data + 1, &data, *msglen-1);
bit_data[0] = typeID;

还有另一个可能的问题,这取决于您对bit_data中的数据以及T中的数据做什么。如果T不是POD类型,那么您根本无法期望位于位副本(memcpy做什么(可以很好地工作。

同样,如果 T是指向指针的成员的类或结构

其中还有一些错误,除了您正在弄乱新的错误。

memcpy线本身您使用&data + 1作为源,这里将是未定义的行为。它会将sizeof(data(字节添加到被复制的地址中,因此在某个地方的堆栈中,而"一个过去"是一个有效的指针,因此此地址在指针算术中是有效的之后。

bit_data[1]是缓冲区中的第二个字符。