我有以下结构。
struct testStruct {
uint8_t firstval[2];
uint16_t secondval;
uinit8_t thirdval;
}myStruct;
现在我得到一个包含以下内容的字符串流。 " / 002/003/000/207/001"
我通过网络获得了这些内容。发送它是" 0x02 0x03 0x00 0xB8 0x01" 但如果我投了这个" / 207"进入uint8_t,我得到184(十六进制0xB8)。所以stringstream内容应该是正确的。
如何将此字符串流的内容复制到结构中?
我试过了:
memcpy((char*)&myStruct, sstream.str().c_str(), len);
myStruct.firstval [0],myStruct.firstval [1]和myStruct.thirdval的值是正确的。 myStruct.secondval的值不正确,因为它是一个2字节数据类型。
答案 0 :(得分:1)
您可能在一个平台上,uint16_t
中的字节以与内存中相反的顺序存储在内存中。您需要使用ntohs
将第二个值从网络字节顺序转换为主机的字节顺序。
此外,结构可以在成员之间插入填充以用于对齐或效率原因,因此通常在原始字节上使用memcpy
将不起作用,除非您确保结构正确打包。
答案 1 :(得分:1)
在我看来,你可能正在阅读大端值,然后将它们解释为小端。您需要字节交换secondval
。首先我要说的是memcpy
序列化根本不可移植,但是如果您希望继续这个方向,我认为只需要在ntohs
上调用myStruct.secondval
就可以了特技。
答案 2 :(得分:1)
比使用memcpy更好的方法:
istream& operator>>(istream& is, testStruct& t)
{
is >> t.firstval[0];
is >> t.firstval[1];
is >> t.secondval;
t.secondval = ntohs(t.secondval);
is >> t.thirdval;
return is;
}