2016-10-11 23 views
-2

16進値の文字列があり、それを関数入力として使用できるようにchar配列に出力する必要があります。16進文字列をchar配列に変換する

ffffff81 0D ffffffcb fffffff2 36 45 7F ffffffee 73 2F 10:SHA512(firststring)の出力しかし

810dcbf236457fee732f100d261c101412e04fc08abd4cb6ddd4442a7cb690acfcae6eeec25e321d5cf5d63174a3b38b31c0143a5702f5f28a43f38b10742853

なること

std::string firststring = "baaaaaaa"; 
char bufferascii[128]; 
std::string firsthash = sha512(firststring); 
firsthash.copy(bufferascii, 128,0); 
char buffer[64]; 
for(int i=0; i<64; i++) { 
    char temp[4]; 
    temp[0] = bufferascii[i*2]; 
    temp[1] = bufferascii[(i*2)+1]; 
    temp[2] = 0; 
    int temp0; 
    sscanf(temp, "%x", &temp0); 
    buffer[i] = (char)temp0; 
    printf("%02x", buffer[i]); printf(" "); 
} 

注、このコードは代わりに印刷され0d 26 1c 10 14 12 ffffffe0 4f ffffffc0 ffffff8a ffffffbd 4c ffffffb6 ffffffdd ffffffd4 44 2a 7c ffffffb6 ffffff90 ffffffac fffffffc ffffffae 6e f

残念なことに
unsigned char buffer[64]; 

:私は、バッファ定義するときfffffee ffffffc2 5E 32 1D 5C fffffff5 ffffffd6 31 74 ffffffa3 ffffffb3 ffffff8b 31 ffffffc0 14 3A 57 02 fffffff5 fffffff2 ffffff8a 43 fffffff3 ffffff8b 10 74 28 53

コードが動作し私は次に、入力としてchar配列を必要とする次の関数にこのunsigned char配列を渡すことはできません。私は、これは私のコンパイラが署名付き文字を使用していることを意味します。

私はここで何が欠けていますか?どんな助けでも大歓迎です。

+2

'printfの( "%の02X"、(unsigned char型)バッファ[i])と;' –

答えて

1

お客様のアーキテクチャには、符号付きのcharがあります。ランクがint未満のすべての整数型は、可変引数の引数として渡されるときにintまたはunsigned intに昇格されます。サインされたプロモーションはサインを保持します。だからこそ、0xFFFFFFは128以上の値に予め設定されています(0x80)。

あなたは、より良いまだ、uint8_tunsigned charに値をキャストするかによって、表示の問題を修正することができます

printf("%02x", (uint8_t)buffer[i]) 
+0

ザ・問題は、次の関数に入力するために符号付きのchar値が必要だということです。 バッファに正しい値が格納されていますが、表示上の問題に過ぎませんか? – Phil

+0

だからこそ私は印刷機能のためにのみ鋳造をお勧めします。あなたのデータは正しいですが、標準出力への途中で(答えに記述されているように)変更されます – krzaq

関連する問題