为什么 Go 在 base64 编码中使用位操作?

代码 2 是 Go 的 base64.Encode。此代码多次使用位操作。


例如,


val := uint(src[si+0])<<16 | uint(src[si+1])<<8 | uint(src[si+2])


和,


val := uint(src[si+0])>>18&0x3F]


我不知道为什么这些位操作需要编码为 base64。这些位操作的含义是什么?


代码:


func (enc *Encoding) Encode(dst, src []byte) {

    if len(src) == 0 {

        return

    }


    di, si := 0, 0

    n := (len(src) / 3) * 3

    for si < n {

        // Convert 3x 8bit source bytes into 4 bytes

        val := uint(src[si+0])<<16 | uint(src[si+1])<<8 | uint(src[si+2])


        dst[di+0] = enc.encode[val>>18&0x3F]

        dst[di+1] = enc.encode[val>>12&0x3F]

        dst[di+2] = enc.encode[val>>6&0x3F]

        dst[di+3] = enc.encode[val&0x3F]


        si += 3

        di += 4

    }


    remain := len(src) - si

    if remain == 0 {

        return

    }

    // Add the remaining small block

    val := uint(src[si+0]) << 16

    if remain == 2 {

        val |= uint(src[si+1]) << 8

    }


    dst[di+0] = enc.encode[val>>18&0x3F]

    dst[di+1] = enc.encode[val>>12&0x3F]


    switch remain {

    case 2:

        dst[di+2] = enc.encode[val>>6&0x3F]

        if enc.padChar != NoPadding {

            dst[di+3] = byte(enc.padChar)

        }

    case 1:

        if enc.padChar != NoPadding {

            dst[di+2] = byte(enc.padChar)

            dst[di+3] = byte(enc.padChar)

        }

    }

}



米脂
浏览 139回答 1
1回答

慕的地10843

这是相同算法的注释 Javascript 实现:https&nbsp;:&nbsp;//en.wikibooks.org/wiki/Algorithm_Implementation/Miscellaneous/Base64#Javascript它告诉你这个循环:需要三个 ASCII 字符(8 位):src[si+0],src[si+1]和src[si+2]将它们合并为一个 24 位数字(即val := uint(src[si+0])<<16 | uint(src[si+1])<<8 | uint(src[si+2]))将此数字重新分隔为 base64 字符列表的四个索引(6 位)。(val>>18&0x3F取之前计算的数字的第18到24位,以此类推)您也可以阅读:https&nbsp;:&nbsp;//en.wikipedia.org/wiki/Base64#Examples
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go