将streamstream转换为struct

时间:2014-05-27 15:42:55

标签: c++ struct casting

我有以下结构。

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字节数据类型。

3 个答案:

答案 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;
}