将XML流转换为十六进制 所以我对C++比较陌生,希望能有一些建议。

将XML流转换为十六进制 所以我对C++比较陌生,希望能有一些建议。,c++,xml,hex,C++,Xml,Hex,我目前正在为一枚科学火箭研制遥测系统,该系统从仪器中获取数据,从软件的管道中存储数据,然后将数据发送到可用的串行端口。问题在于仪器以XML格式传输数据包,例如: <Sample Value="-4.80521e-012" /> <Sample Value="4.90272e-012" /> <Sample Value="3.49013e-011" /> <Sample Value="2.13785e-010" /> <Sample Value

我目前正在为一枚科学火箭研制遥测系统,该系统从仪器中获取数据,从软件的管道中存储数据,然后将数据发送到可用的串行端口。问题在于仪器以XML格式传输数据包,例如:

<Sample Value="-4.80521e-012" />
<Sample Value="4.90272e-012" />
<Sample Value="3.49013e-011" />
<Sample Value="2.13785e-010" />
<Sample Value="2.38185e-010" />
<Sample Value="1.70573e-010" />
<Sample Value="1.16129e-011" />
那么,我的问题是:有人能提出一个好的方法吗?我应该尝试从流中删除子字符串集,还是在XML和十六进制之间进行转换更简单?我再次注意到,这是在C++中完成的。 致以最良好的祝愿


Tarjei

如果来自仪器的数据只是非常简单的XML(如示例中所示),则可能不需要完整的XML解析器,但可以“手动”解析每一行

对于每行,提取表示值的子字符串:

<Sample Value="-4.80521e-012" />

然后分析提取的子字符串
“-4.80521e-012”
,例如使用
sscanf
strof
,以获得32位
float
,并最终将该float转换为
无符号long
sprintf(“08x”…)
it.

该问题包括两个步骤:解析XML并将浮点值转换为其在IEEE 754中的十六进制值表示形式

对于解析XML,有几个库可以简单地重用。您只需考虑输入是否始终是一个完整的、有效的XML,或者仅仅是不能独立存在的片段。我不确定你的问题是否如此

为了将浮点转换为IEEE 754十六进制,大多数系统在内部表示IEEE 754中的浮点。如果您的系统是这样的,那么您只需找到get to the representation

您可以使用此选项(从以下位置输入):


串行端口上的浮动应采用哪种编码?使用IEEE 754时,示例中的数字不匹配。或者这些只是虚构的例子?这里的六维值只是说明性的!从rocket probe,我希望XML是规定格式的,而到串行端口,我将以“2c34b73f”格式发送十六进制,即之前没有十六进制标识符0x。如果我将标识符放在组合的十六进制值之前,那么在使用IEEE 754时,它们应该表示一个非常小的数字(如上所述的XML)。您写道“由于设备不支持十六进制格式,我需要动态转换/转换此流为4字节十六进制”。我认为你应该重新回答你的问题。你有没有任何XML/通用库或框架在使用?或者你可以在你的项目中添加一个?(对于XML C++分析器,请参阅)米歇尔瓦兹:我现在稍微修改了一下,谢谢。king_nak:我想我可以使用解析器,但我担心在格式化解析流时会遇到更多问题。我对此几乎没有经验;你认为我可以通过这样的解析器得到纯十六进制吗?我一直在谷歌上搜索的那些似乎有非常不同的规格!格式非常简单,所以我想我会尝试一下这一行。我猜流中的第一行是一个标题,但是我可以删除它。这对于转换应该很好。关于句法分析;由于我只是从一个“连续流”的数据流中传输数据,并每隔N秒发送缓冲区收集的任何数据,我不知道缓冲区中的数据是否可以轻松解析。这是因为XML格式不完整。我想我可能需要另一种方法来解释表单“”上的单个示例。
<Sample Value="-4.80521e-012" />
-4.80521e-012
std::string floatToIEEE754(float f) {
    if (!std::numeric_limits<float>::is_iec559) {
        std::cerr << "Not in IEEE 754 format!" << std::endl;
        return "";
    }

    std::stringstream ss;
    ss << std::hex << std::setw(2);
    ss << static_cast<int> (reinterpret_cast<unsigned char*>(&f)[0]);
    ss << static_cast<int> (reinterpret_cast<unsigned char*>(&f)[1]);
    ss << static_cast<int> (reinterpret_cast<unsigned char*>(&f)[2]);
    ss << static_cast<int> (reinterpret_cast<unsigned char*>(&f)[3]);

    // Or to get it as int:
    //int i;
    //ss >> i;
    //return i;

    return ss.str();
}
std::string floatToIEEE754(float f) {
    std::stringstream ss;
    // Treat bits of float as an int, and print them as hex
    ss << std::hex << *((int*) &f);
    return ss.str();
}