質問: ### 前提・実現したいこと 16進数と、2進数の変換について教えてください。 63 60 20 19 fc c7 01 18 70 4a 20 5b 81 ac 08 c5 6a ca 24 00 という16進数を2進数にして、各バイトのLSB(Least significant bit:最下位ビット)を左にして1本のビット列にした結果が、次のようになっています。 ``` 11000110 00011111 11110011 00000011 00000000 00100010 00000110 01000111 11111100 00100001 00000001 00000000 01100100 00010100 10110001 10000010 10001100 01111111 11100001 00010100 10000110 00100001 10010110 11000000 01001100 10010000 00010111 00000010 01101100 11000111 11111100 00101010 11011100 01111010 11011100 00001110 01011010 01110001 11001010 01000000 00000000 ``` この変換ルールを読み解きたいので、お知恵をお貸しください。 ### 試したこと 前から考えると、「LSBを左にする」を左右を反転すると読むと ``` 63→1100011-LSBを左にする→1100011 60→1100000-LSBを左にする→0000011 20→100000-LSBを左にする→000001 ``` です。見やすいように区切りを8桁ごとにいれると、次のようになります。 ### 発生している問題 ``` 11000110 00001100 0001 ``` この3つの16進数を2進数に変換しただけで、もう数字が違っています。 ### 試したこと 次に、「LSBを左にする」をLSBのみを左に移動すると読むと ``` 63→1100011-LSBを左にする→1110001 60→1100000-LSBを左にする→0110000 20→100000-LSBを左にする→010000 ``` です。見やすいように区切りを8桁ごとにいれると、次のようになります。 ### 発生している問題 ``` 11100010 11000001 0000 ``` これはぜんぜん違うみたいです。 どのように考えたら、上の結果を導けるのか、ご指導いただければ幸いです。 この数字列は、 http://blog.livedoor.jp/cperl/archives/22023950.html を参考にしています。 Windows10, 64bit, Visual Studio 2017 Communityです。
回答: 本回答は間違いでした! 参照ページをよくみるとzlib(すみません、最初ハフマンコードって書きましたがそれより前に多分zlibで圧縮したもの)ですね! 下記回答は全然違ってます。大変失礼しました。 > > 16進数を2進数にして、各バイトのLSBを左にして1本のビット列にするとは? > > > 参照されているページにはそうは書いてません。「各バイトのLSBを左にして一本のビット列にしたもの。」と書いてあります。 つまり「各バイトの」であり「16進数を2進数に」とは書いてません。うーん、この微妙な違いがわかるでしょうか?なにがまずいかと言えば「16進数」と言われても「何ケタの16進数なのか?」というのがわかりませんがこのページで話題にしているのはあきらかに特定のビット数幅での処理です。「各バイトの」と言われれば「あぁ、8bitごとに何かするんだな」ということがわかります。 > > 各バイトのLSBを左にして一本のビット列にしたもの。 > > > は「1バイトずつ先頭から取り出し(通常はMSBを左(先)にLSBを右(後)に並べるが)それを逆順に並べる」と解釈すべきです。また変換は8bitごとに(どのビットも落とさずに全て変換対象にする)ので**上位の0を省略してはいけません**。1バイトの内容を16進数を0xで始めた2桁, 2進数を0bで始まる8桁で表すことにすると、 ``` 0x63 => 0b01100011 =>左右反転は=> 0x11000110 です。 (A) ``` (A)を先頭の0のビットを省略し0b1100011と解釈してはいけません。質問者さんは先頭の0を「いらないビット」と解釈してしまったため混乱しているのだと思います。