如何将数据复制到字节数组的某些部分
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;
}
但这不起作用。我想我错了错误。我想将Unkown结构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类型,那么您根本无法期望位于位副本(memcpy
做什么(可以很好地工作。
同样,如果 T
是指向指针的成员的类或结构
其中还有一些错误,除了您正在弄乱新的错误。
memcpy
线本身您使用&data + 1
作为源,这里将是未定义的行为。它会将sizeof(data(字节添加到被复制的地址中,因此在某个地方的堆栈中,而"一个过去"是一个有效的指针,因此此地址在指针算术中是有效的之后。
bit_data[1]
是缓冲区中的第二个字符。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '