2012-02-10 11 views
0

バイナリファイル(C++)を読み込んでいます。ヘッダは、この(16進数で印刷)バイナリファイルの解釈

43 27 41 1A 00 00 00 00 23 00 00 00 00 00 00 00 04 63 68 72 31 FFFFFFB4 01 00 00 04 63 68 72 32 FFFFFFEE FFFFFFB7ようなものです

用いて印刷した場合:

std::cout << hex << (int)mem[c]; 

stringstreamを使用せずに整数に9thバイトである23を格納するための効率的な方法がありますか(?)?またはstringstreamが最善の方法ですか?私はnない3523を保存したい

int n= mem[8] 

よう

何か。

+1

「mem」とは何ですか? – PlasmaHH

+1

値が '1A'のときに何を保存しますか? –

+0

memは char * memです。 – Robert

答えて

1

あなたは2進化10進数として値を扱いたいわけですか?その場合は、次のように変換することができます:

unsigned char bcd = mem[8]; 
unsigned char ones = bcd % 16; 
unsigned char tens = bcd/16; 

if (ones > 9 || tens > 9) { 
    // handle error 
} 

int n = 10*tens + ones; 
5

nに23を保存しました。 35と表示されるのは、表示用に10進数に変換するルーチンで出力するためです。

int n=0x23; 

(あなたがかもしれないが:コンピュータ内部のバイナリデータを見ることができれば、あなたはそれはあなたがやったかのようにあなたが同じ結果を得るでしょう、実際に六角23

であることがわかりますのみ対応する番号は、あなたが取得しているものである、31のですか?1Eためnに格納する必要があります。どのような数は不可能であるしたいと思います。)

+0

バイナリデータを見ると、実際には '0000 0000 0010 0011'(または' 0011 0010 0000 0000'、または64ビットの等価物)であることがわかります。これは、10進数で表示するのと同じように16進数で表示するように変換されました。私はいつもこれを指摘して、整数変数に固有の基底(バイナリ以外)がないことを理解するのに役立ちます。 –

+0

私は実際に私の答えの草案でそれを持っていましたが、理解できる方法を見つけることができませんでした。しかし、あなたはかなり正しいです、それは重要なポイントです。 –

+0

私はこれを理解していますが、実際にはコードの23を後で使用したいと考えています。だから、どのように例えば23回と35回ではない(これは私が得る数です)。 – Robert