2012-04-26 46 views

回答

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= 
3

您必須將原始二進制轉換爲十六進制(或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 |