在xml中存储C ++二进制输出

时间:2012-04-26 14:54:20

标签: c++ xml

根据xsd,支持的二进制类型是hexbinary和base64编码的二进制数据。 http://www.w3schools.com/schema/schema_dtypes_misc.asp

我的目的是从内存中读取原始字节内容并将其序列化为xml文件。因此,上面的数据类型将描述原始字节内容或者我必须确保将原始字节内容转换为十六进制以符合上述2种数据类型之一吗?

2 个答案:

答案 0 :(得分:3)

您必须将原始二进制转换为十六进制(或base64)表示。例如,如果字节的值是255(十进制),则它的十六进制表示(作为字符串)将是“ff”。

用于存储原始输入的(常规)类型是unsigned char,因此您可以逐字节地获得范围0-255,但是对于该数组的每个字节,您需要在signed char中使用两个字节(或者std :: string)类型来存储表示,这就是你在XML中使用的。

您的框架可能有一种将原始字节转换为Base64或hex的方法。如果没有,这是十六进制的一种方法:

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main (void) {
    ostringstream os;
    os.flags(ios::hex);

    unsigned char data[] = { 0, 123, 11, 255, 66, 99 };

    for (int i = 0; i < 6; i++) {
        if (data[i] < 16) os << '0';
        os << (int)data[i] << '|';
    }

    string formatted(os.str());

    cout << formatted << endl;

    return 0;
}          

输出: 00 | 7b | 0b | ff | 42 | 63 |

答案 1 :(得分:1)

您需要将原始数据编码为两种数据类型之一。这是为了防止一些随机数据搞乱XML格式,例如,如果您在某处嵌入了<数据。

您可以选择最适合您的两种方式。十六进制类型更容易编写代码但生成更大的文件 - 字节输出与字节的比率为2:1,其中Base64编码为4:3。您不需要编写自己的代码,Base64转换函数随时可用。这是一个在答案中包含一些代码的问题:How do I base64 encode (decode) in C?

作为编码如何不同的一个例子,这里是两个方式编码的短语“The quick brown fox jumps over the lazy dog.”。

十六进制:

54686520717569636b2062726f776e20666f78206a756d7073206f76657220746865206c617a7920646f672e

Base64的:

VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy4=