代码 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
- 1 回答
- 0 关注
- 138 浏览
添加回答
举报
0/150
提交
取消