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

How to copy data into certain parts of a byte array

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

我目前有这个代码:

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;
}

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

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

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

  2. 最终的问题是&data + 1等于(&data)[1],这将越界并导致未定义的行为.您应该从 &data.

  3. 复制

将所有内容放在一起最后一行应该是

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

还有另一个可能的问题,这取决于您对 bit_data 中的数据所做的操作以及 T 是什么。如果 T 不是 POD type,那么您根本无法指望按位复制(memcpy 所做的)工作得很好。

此外,如果 T 是一个 class 或结构,其成员是指针,那么您无法将它们保存到磁盘或传输到另一台计算机,甚至无法传输到同一台计算机上的另一个进程。

除了你在乱用新东西之外,还有一些错误。

memcpy 行本身你使用 &data + 1 作为来源,这里将是未定义的行为。它会将 sizeof(data) 字节添加到复制到堆栈中某处的地址,而 "one past the end" 是一个有效指针,因此该地址在指针算术中有效,您从中读取的任何内容都不会,之后也不会它。

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