0

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

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

4

2 回答 2

3

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

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

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

#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|

于 2012-04-26T14:59:12.257 回答
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=
于 2012-04-26T15:20:19.437 回答