如何将数据复制到字节数组的某些部分
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*]
的位置。实现此目标的最佳方法是什么?
一个可能的问题和一个确定的问题:
可能的问题是数组索引从零开始。所以你应该复制到bit_data + 1
跳过第一个字节,然后当然使用bit_data[0]
设置类型id。
最终的问题是&data + 1
等于(&data)[1]
,这将越界并导致未定义的行为.您应该从 &data
.
复制
将所有内容放在一起最后一行应该是
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]
是缓冲区中的第二个字符。
我想用未知结构创建一个字节数组,并在这个字节数组的前面额外添加一个数字。我该怎么做?
我目前有这个代码:
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*]
的位置。实现此目标的最佳方法是什么?
一个可能的问题和一个确定的问题:
可能的问题是数组索引从零开始。所以你应该复制到
bit_data + 1
跳过第一个字节,然后当然使用bit_data[0]
设置类型id。最终的问题是
&data + 1
等于(&data)[1]
,这将越界并导致未定义的行为.您应该从&data
. 复制
将所有内容放在一起最后一行应该是
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]
是缓冲区中的第二个字符。