2016-12-21 3 views
0

で16進数文字列に変換し、バッファ、 下の画像は、バイナリファイルの入力ファイル enter image description here です。問題は、私は以下のようにC言語で16進文字列にバッファを変換しようとしているC

#include "stdio.h" 
#include "stdlib.h" 

#include "string.h" 
#include "fcntl.h" 


#if defined(_MSC_VER) 
#include <BaseTsd.h> 
typedef SSIZE_T ssize_t; 
#endif 

#define BUFF_SIZE 5  

int main() 
{ 
    char  buff[BUFF_SIZE]; 
    int  fd; 
    ssize_t rd_size; 
    FILE *rfp; 
    FILE *ofp; 
    ofp = fopen("output.txt", "w"); 
    rfp = fopen("test.bin", "rb"); 


     while (4== (fread(buff, 1, 4, rfp))) 
     { 
      fprintf(ofp, "%02X%02X%02X%02X \n", buff[0], buff[1], buff[2], buff[3]); 
     } 

    fclose(ofp); 
    fclose(rfp); 
    return 0; 
} 

その後、私は上記のコードを使用、私はHEXファイル にビンを持っているが、私は結果で問題を持っています。

04002B2B 
000001FFFFFFFF 
00030003 
00000000 
00000000 
00000000 
00000300 
00000000 
00000000 
00000000 
00000000 
00000000 
00000000 
00000000 
00500050 
00500050 
00500050 
00500050 
00000000 
FFFFFF80002000 
00000000 
08700F00 
00000000 
00000000 
00000001 
00000002 
00000003 
00000004 
00000005 
00000006 
00000007 
FFFFFF800FFFFFFFF01E 
087007FFFFFF80 
00320032 
0BFFFFFFB80820 
00050005 
2DFFFFFFC7114D 
00FFFFFFC20118 
00001B58 

上記のファイルがありますが、特に私はこの出力を "000001FFFFFFFF"にしたくありません。しかし、私は、私はLinux上で実行したい

更新

を行うことになっていますかわかりません。しかし、私がファイルを実行すると、私はsegmantエラーを受け取りました。 私は何をすべきか教えていただけますか?

答えて

2

ここでの大きな問題は、(charsignedまたはunsignedは実装固有のものである場合)、あなたのcharタイプはsignedのようだということです。つまり、0x80以上の値は負の値として処理されます(two's complementシステムの場合)。

このような値をprintfに渡し、値がpromotedからintになると、符号拡張されます。従って0xff0xffffffffになり、それが印刷されます。

unsigned charを代わりに使用すると、0xffのような値は、unsigned intに昇格されると拡張されません。したがって0xff0x000000ffに昇格され、先頭のゼロは印刷されません。


もう1つの問題は、printfに間違った形式を使用していることです。 "%x"の形式は、unsigned intであり、unsigned charではありません。たとえば、 this printf (and family) referenceあなたはすべての書式設定コードとさまざまな種類の異なるサイズの接頭辞を持つ大きな表が表示されます。 unsigned charを印刷するには、"%hhx"のように接頭辞hhを使用する必要があります。

+0

簡単な質問です。私はgccでlinuxを実行したいが、私はいくつかのセグマントフォルトを持っている。 – grander3

+0

@ grander3それはまったく別の問題であり、何か新しい質問を投稿するべきである。しかし、それを行う前に、デバッガを使ってクラッシュが発生する場所を調べてください。表示するソースで、クラッシュの位置をコメントで示します。また、クラッシュの時点で関与するすべての変数の値を表示します。ああ、あなたがクラッシュをキャッチするときは、コールスタックを*あなたのコードに移動してください。 –

+0

@ grander3また、ツアーを受けてください(http://stackoverflow.com/tour)と[良い質問をする方法を読む](http://stackoverflow.com/help/how-to-ask)。それはstackoverflow.comでここにあなたを助けます。 –

関連する問題