- ベストアンサー
CGI 16進数をバイナリ-に変換
sea_clear_sky8です。 今、2バイトの漢字の文字をCGIで、ブラウザに出力するために、 サンプルを解読しています。それは16進数の文字コードを バイナリ-に変換する方法が載っています。 その部分のほんの一部分ですが、この計算しきの意味がわかりません。 char calc; if(src[i]='A')[ /*'A'から'F'のときは10-15*/] calc =src[i]-'A'+10; この計算の仕方と意味がわかりません。 SRC[i]には文字の値(文字コードの値?)が入っていて、 それから、文字のAを引いて10足すと どんな結果が返ってくるのかわかりません。 /*また、4ビット左シフトで上位ビットに*/ calc=calc << 4 というのも意味がわかりません。 ご教授願います。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> calc =src[i]-'A'+10; は src[i]の内容から 'A'(0x41)を減算して 10を加算するという意味です srcに ABCDといった文字列がある場合 src[0] = 'A', src[1] = 'B', src[2] = 'C', src[3] = 'D' といった具合に格納されています 上記の式を適用すると i=0の場合 calc = 'A' - 'A' + 10 = 0 + 10 = 10 = 0x0A i=1の場合 calc = 'B' - 'A' + 10 = 1 + 10 = 11 = 0x0B i=2の場合 calc = 'C' - 'A' + 10 = 2 + 10 = 12 = 0x0C i=3の場合 calc = 'D' - 'A' + 10 = 3 + 10 = 13 = 0x0D となります calc = calc << 4 は calcの内容を 左へ4ビットシフトしたものを calcに代入となります calc = 0x0A の場合 2進数では 0000 1010 と表記できます これを4ビット左シフトすると 1010 0000 となり 0xA0を生成できます calc << 1 1ビットのシフト 0001 0100 0x14 calc << 2 2ビットのシフト 0010 1000 0x28 calc << 3 3ビットのシフト 0101 0000 0x50 calc << 4 4ビットのシフト 1010 0000 0xA0 といったことです > if(src[i]='A')[ このif文は期待通りの結果を生まないでしょう 比較演算ならば == にしないといけません > /*'A'から'F'のときは10-15*/] のコメントのあるような場合なら if ( src[i] >= 'A' && src[i] <= 'F' ) { といった記述の方が望ましいでしょう
その他の回答 (1)
- eroermine
- ベストアンサー率18% (83/444)
src[i] に 'A' が入ってる場合 'A' を引いて 10 を足すと 10 これは 0xA に相当します。 'F' まで同様。 シフト演算子 << は 代入よりも優先なので calc = (calc<<4) と同様
お礼
回答ありがとうございます。 参考になりました。 ありがとうございました。
お礼
回答ありがとうございます。 詳しく回答して頂いて、よくわかりました。 ありがとうございました。