22362


Golangのhex.Encodeでは[]byte(uint8のスライス)の要素をビットシフトや0fとの論理積を使って16進数の文字列の[]byteに変換しています  
なぜ、uint8をビットシフトや0fとの論理積で16進数に変換できるのでしょうか?

[code]

    
    
    const hextable = "0123456789abcdef"
    
    /* 中略 */
    
    func Encode(dst, src []byte) int {
        for i, v := range src {
            dst[i*2] = hextable[v>>4]
            dst[i*2+1] = hextable[v&0x0f]
        }
    
        return len(src) * 2
    }
    
    
[/code]


CC BY-SA 3.0
2016-02-21T12:47:44.863
22361
2016-02-21T13:11:16.030
5246
question
go
Golangでbit演算で10進数を16進数に変換する方法


hextable
には0～15を16進数で表わした文字が並んでいます。uint8型の値から4bitずつ切り出せば0～15の数値が得られるので、これを添え字としてhextableから文字を取り出しています。

例えばあるバイトが0xAEだったとすると

  * `0xAE >> 4` は 10 (0xA) 、`hextable[10]` つまり11文字目は `a`
  * `0xAE & 0x0f` は 14 (0xE) 、`hextable[14]` つまり15文字目は `e`

これらを順番に並べていくと16進数の文字列が得られます。

ビットシフトや論理積は4bitずつ分けるのに使っているだけで、ポイントはhextableの方です。

類似の例として、BASE64のエンコード処理は6bitごとに切り、64文字のテーブルを参照します。

<https://ja.wikipedia.org/wiki/Base64>


CC BY-SA 3.0
2016-02-21T13:11:16.030
22362
2016-02-21T13:11:16.030
8000
22361
answer