2011-01-22 27 views
2

配列を16進数に変換して文字列変数に入れようとしています。次のループでprintfは正常に動作しますが、sprintfを正しく使用することはできません。 16進値をASCII形式で配列に埋め込むにはどうすればよいですか?'sprintf'を使って16進数を文字列に変換する

static unsigned char digest[16]; 
static unsigned char hex_tmp[16]; 

for (i = 0; i < 16; i++) { 
    printf("%02x",digest[i]); <--- WORKS 
    sprintf(&hex_tmp[i], "%02x", digest[i]); <--- DOES NOT WORK! 
} 
+6

非常に悪いエラーの説明があり、「動きません」。それはクラッシュしますか?コンパイルエラーが出ますか?エラーは発生しませんが予期しない結果はありますか?予期しない結果は何ですか?代わりにあなたは何を期待しましたか? – sth

+0

あなたの質問に対する部分的な答えはここにあります:(16 * 2)+ 1とは何ですか?ループは0から??まで実行されます。何回繰り返しますか? – JimR

答えて

9

おそらく、あなたが必要とする:

&hex_tmp[i * 2] 

も大きな配列を。

+0

ありがとう、なぜ私は* 2が必要なのかはっきりしませんでしたが、それはうまくいったのです。 – Dberg

+1

は、配列の1要素ごとに2文字を出力するためです。あなたのターゲットhex_tmpは、通常、ダイジェストの要素の2倍の数字を持つため、通常は* 2で、16 * 2 + 1桁の長さにする必要があります。最後にhex_tmp [32] = 0を忘れないでください。 – Vitali

-2

数値として格納された文字は、文字列と同じではありません。

unsigned char i = 255; 
unsigned char* str = "FF"; 
unsigned char arr1[] = { 'F', 'F', '\0' }; 
unsigned char arr2[] = { 70, 70, 0 }; 
8
static unsigned char digest[16]; 
static char hex_tmp[33]; 

for (i = 0; i < 16; i++) { 
    printf("%02x",digest[i]); <--- WORKS 
    sprintf(&hex_tmp[i*2],"%02x", digest[i]); <--- WORKS NOW 
}