2017-09-10 8 views
0

の例では、進バイトの各プリントアウトするために、私は、私が反復処理したい進データとCプログラムのコードを持っています。しかしC印刷進バイト

char input[] = "\x31\xd2\xb2\x30"; 
for (int i = 0; i < strlen(input); i++) { 
    printf("%02X\n", input[i]); 
} 

は、出力は私何ではありません例えば上記印刷、期待:

31 
FFFFFFD2 
FFFFFFB2 
30 

Iはまた、しかし、私は同じ出力を受け取り、(unsigned int)として出力をキャストすることを試みました。

誰かがこの簡単なスクリプトで問題を指摘できますか?

+1

システムでは、 'char'はおそらく' signed'です。したがって、データ '\ xd2'は負の値です。その値を 'printf'に渡すと、署名された' int'に昇格します。しかし、フォーマット指定子 '%X'は' unsigned int'を期待しており、それに応じてバイナリデータを解釈します。 *未定義の動作*です。 –

答えて

1

の引数は、符号拡張されています

printf("%02X\n", (unsigned char)input[i]); 
+0

あなたが正しいですよ。私はunsigned intを使用しましたが、もちろんcharです。 – user1220022

0

char input[]は、unsigned char input[]である必要があります。バイナリバイトを格納する方法です。あなたはこのような符号なしの型にそれらをキャストしない限り、printf関数に渡さ

1

printf("%02X")は、符号なし整数を期待します。 charの負の値(およびcharタイプの0xD2)を負の値にすると、負のchar値が32ビットの符号なしintに昇格し、1の先頭ビットが埋められ、最後に0xFFFFFFD2が生成されます。これが印刷されます。

はこれを克服するために、あなたは、8ビットの値として提供された値を取るようにprintfを「伝える」ことができます:

printf("%02hhX\n", input[i]) 

その後、0xD2は「考えられないので、別のオプションは、unsigned charとしてinputを宣言するだろう32ビットへの「負、および昇進は期待通りに動作します:その後、strlenが入力をキャストするために必要となる

unsigned char input[] = "\x31\xd2\xb2\x30"; 

注、すなわちを0。

0
// You can use like this 

char input[] = "\x31\xd2\xb2\x30"; 

for (int i = 0; i < strlen(input); i++) { 
    printf("%02X\n", input[i] & 0xff); 
} 

Output: 
31 
D2 
B2 
30 

これは、上位ビットをマスクして下位8ビットのみを保持します。