我想用未知结构创建一个字节数组,并在该字节数组的前面另外添加一个数字。我该怎么做?
我目前有这段代码:
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*]
的位置。实现这一目标的最佳方法是什么?
答案 0 :(得分:1)
一个可能的问题和一个明确的问题:
可能的问题是数组索引从零开始。因此,您应该复制到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
是具有指针成员的类或结构,则您无法将这些成员保存到磁盘或转移到另一台计算机,甚至转移到同一台计算机上的其他进程。
答案 1 :(得分:1)
除了你正在搞乱新事物之外,还有一些错误。
memcpy
行本身使用&data + 1
作为源,这里将是未定义的行为。它会将sizeof(数据)字节添加到地址中,该地址在某个地方的堆栈中被复制,而#34;一个超过结束的地址&#34;是一个有效的指针,所以这个地址在指针算术中是有效的,你从中读取的内容都不会,也不会是它之后的任何内容。
bit_data[1]
是缓冲区中的第二个字符。