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

时间:2017-06-28 13:49:49

标签: c++ arrays bit memcpy

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

我目前有这段代码:

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错了。我想将未知的struct T复制到bit_data[1]bit_data[*end*]的位置。实现这一目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

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

  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是具有指针成员的类或结构,则您无法将这些成员保存到磁盘或转移到另一台计算机,甚至转移到同一台计算机上的其他进程。

答案 1 :(得分:1)

除了你正在搞乱新事物之外,还有一些错误。

memcpy行本身使用&data + 1作为源,这里将是未定义的行为。它会将sizeof(数据)字节添加到地址中,该地址在某个地方的堆栈中被复制,而#34;一个超过结束的地址&#34;是一个有效的指针,所以这个地址在指针算术中是有效的,你从中读取的内容都不会,也不会是它之后的任何内容。

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