为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
米脂 2021-11-22 15:08:47
代码 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)        }    }}
查看完整描述

1 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

这是相同算法的注释 Javascript 实现:https : //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 : //en.wikipedia.org/wiki/Base64#Examples


查看完整回答
反对 回复 2021-11-22
  • 1 回答
  • 0 关注
  • 138 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信