根據xsd,支持的二進制類型是十六進制和base64編碼的二進制數據。 http://www.w3schools.com/schema/schema_dtypes_misc.asp在xml中存儲C++二進制輸出
我的意圖是從內存中讀取原始字節內容並將其序列化爲xml文件。因此,上面哪些數據類型將描述原始字節內容,或者是否必須確保原始字節內容轉換爲十六進制以符合上述兩種數據類型之一?
根據xsd,支持的二進制類型是十六進制和base64編碼的二進制數據。 http://www.w3schools.com/schema/schema_dtypes_misc.asp在xml中存儲C++二進制輸出
我的意圖是從內存中讀取原始字節內容並將其序列化爲xml文件。因此,上面哪些數據類型將描述原始字節內容,或者是否必須確保原始字節內容轉換爲十六進制以符合上述兩種數據類型之一?
您需要將原始數據編碼爲兩種數據類型之一。這是爲了防止一些隨機數據搞亂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=
您必須將原始二進制轉換爲十六進制(或base64)表示。例如,如果字節的值是255(十進制),它的十六進制表示(作爲字符串)將是「ff」。
用於存儲原始輸入的(傳統)類型是無符號字符,因此您可以輕鬆地逐字節地獲取範圍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 |