2013-03-17 36 views
0

我有一個char [32]認爲由ASCII字符組成,其中的一些可以是非打印的字符,然而,它們都爲0的有效範圍到255C++轉換十六進制數,以人類可讀的字符串表示

比方說,它包含這些數字: {9A 2E 5C 66 26 3D 5A 88 76 26 F1 09 B5 32 DE 10 91 3E 68 2F EA 7B C9 52 66 23 9D 77 16 BB C9 42}

I」但是,如果使用printf或sprintf將其打印出來或以std :: string存儲爲「9A2E5C66263D5A887626F109B532DE10913E682FEA7BC95266239D7716BBC942」,但是,如果使用printf或sprintf將其打印出來,它將生成每個數字的ASCII代表,而將打印出「ö。\ f & =Zàv&Òμ2fi> h /Í{... Rf#ùwª... B「,這是正確的ASCII字符表示,因爲:ö= 9a,。 = 2e,...

如何可靠地獲取十六進制數字的字符串表示形式?即:我期望一個字符[64],其中包含「9A2E5C66263D5A887626F109B532DE10913E682FEA7BC95266239D7716BBC942」,而不是。

謝謝!

回答

0
void bytesToHex(char* dest, char* src, int size) { 
    for (unsigned int i = 0; i < size; i++) { 
     sprintf(&dest[i * 2], "%02x", src[i]); 
    } 
} 

你必須在這裏分配你自己的記憶。 它會這樣使用:

char myBuffer[32] 
char result[65]; 
bytesToHex(result, myBuffer, 32); 
result[64] = 0; 

// print it 
printf(result); 

// or store it in an std::string 
std::string str = string(result); 
+0

是的! %02x,非常感謝你! 我做了另一個for循環後sprintf循環將'\ 0'轉換爲'0',所以我愚蠢。 – Zennichimaro 2013-03-17 22:19:09

0

我想:

char szStringRep[64]; 
    for (int i = 0; i < 32; i++) { 
    sprintf(&szStringRep[i*2], "%x", szHash[i]); 
    } 

它按預期工作,但如果遇到了< 0x10的數量,因爲它是印刷0

0

您可以將字符串編碼爲像另一個系統將空終止Base64,在使用加密算法時被廣泛使用。

+0

我正在考慮...但系統需要十六進制字符串。 Base64可能需要另一個步驟來轉義字符串。例如,對於相同的數據,它會生成AC5cZiY9Woh2JvEJtTLeEJE + aC/qe8lSZiOddxa7yUI = – Zennichimaro 2013-03-17 22:23:23

相關問題