02月27, 2018

二进制的相关笔记

假放完了,班也上了几天。也要兑现自己年前的一些承诺,就是清空杯子,让自己重新回炉重学一些知识。

这次的分享是关于base64及二进制的一些笔记。

拿汉字”我“来举例,它的base64结果为:5oiR

alt

那么来推导一下这个结果是怎么出来的吧。

在node中,一个汉字是三个字节,1个字节等于8位,所以一个汉字就是24位。

let buf = Buffer.from("我");
console.log(buf); // 就可以得到<Buffer e6 88 91>,里面存放的是16进制

解析成二进制的结果是:

// 把16进制转成2进制 toString()
console.log((0xe6).toString(2));  // 11100110
console.log((0x88).toString(2));  // 10001000
console.log((0x91).toString(2));  // 10010001

通过toString方法,可以进行二进制间的转换。

因为base64是将3个字符变成4个字符,也就是将上面的二进制结果,从原来的八个一组,变成六个一组,但是一个字节是八位,所以要在前面补两个0。

11100110 10001000 10010001     // 之前的二进制
111001 101000 100010 010001    // 切刀,六个一组
00111001 00101000 00100010 00010001  // 需要在前面被0,来达到八位

所以这里最大的二进制也就是00111111,转成十进制,就是63,这也是base64的原因。

parseInt("00111111", 2); // 63

再取上面每一个字节的十进制。

// 通过parseInt可以将X进制转为十进制,X可以为二进制或八进制或十六进制
console.log(parseInt("00111001", 2));   // 57
console.log(parseInt("00101000", 2));   // 40
console.log(parseInt("00100010", 2));   // 34
console.log(parseInt("00010001", 2));   // 17

最后就是去可见编码中找到对应的值。

alt

let str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
str += "abcdefghijklmnopqrstuvwxyz";
str += "0123456789"
str += "+/";
console.log(str[57] + str[40] + str[34] + str[17]);  // 5oiR

这样就得到了和上面截图中一模一样的值了。

本文链接:www.my-fe.pub/post/binary-note.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。