计算机:进制,字节,字符,编码,缓冲,流
字节
整数各种进制的字面量如下:
十进制数,没有前缀
二进制数,前缀是0b
八进制数,前缀是0o
十六进制数,前缀是0x
let decimalInteger = 17 let binaryInteger = 0b10001 // 二进制的17 let octalInteger = 0o21 // 八进制的17 let hexadecimalInteger = 0x11 // 十六进制的17
字节,字符和编码
1,二进制和字节
只有寄存器能摸到二进制位,其他语言和文件都是基于字节的,字节在语言层面等于二进制
2,字符和编码
编码的作用是从字节数据。从字节对应到特定字符;
字符和文本是等价概念;
编码格式对应相应的字符集;
字符或文本,被创建和保存,被读取时需要以相同的编码才能使用,否则会出现乱码;创建和读取都可以指定编码
3,编码和转换
参考:https://www.jianshu.com/p/6bd6869058d6 (Ascii、unicode、HEX、URL、base64)
4,unicode字符集
世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是 Unicode,就像它的名字都表示的,这是一种所有符号的编码。
Unicode仅仅只是一个字符集,规定了符合对应的二进制代码,至于这个二进制代码如何存储则没有任何规定。它的想法很简单,就是为每个字符规定一个用来表示该字符的数字,仅此而已。以汉字“汉”为例,它的 Unicode 码点是 0x6c49,对应的二进制数是 110110001001001,二进制数有 15 位,这也就说明了它至少需要 2 个字节来表示。可以想象,在 Unicode 字典中往后的字符可能就需要 3 个字节或者 4 个字节,甚至更多字节来表示了。
5,base64
base64_encode() base65_decode()
6,URL编码
0x20 ~ 0x7e
范围内的一部分字符和范围外的所有字符都会被url编码,同时也包括汉字等其他文字。urlencode() 特殊字符的转换, # 用来标志特定的文档位置 %23 % 对特殊字符进行编码 %25 & 分隔不同的变量值对 %26 + 在变量值中表示空格 %2B \ 表示目录路径 %5C = 用来连接键和值 %3D ? 表示查询字符串的开始 %3F urldecode() 字符串中的任何 %##。加号('+')被解码成一个空格字符
7,Hex编码
ASCII码G的Hex编码过程: Ascii码:G(71) 二进制码:0100-0111 重新分组:0000-0100 0000-0111 十六进制: 4 7 Hex编码:47
缓冲和流
在c中流可分为两大类,即文本流和二进制流。
1,所谓文本流是指在流中流动的数据是以字符形式出现。
2,二进制流是指流动的是二进制数字序列,若流中有字符,则用一个字节的二进制ASCII码表示,若是数字,则用一个字节的二进制数标识。在流入流出时,对\n符号不进行变换。
计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。
1,字节流(二进制流)和字符流(文本流)
2,输入流(读取),输出流(写入),双工流(读写),可转换(读写+转换)流
3,buffer和stream:stream是对buffer的封装,操作的还是buffer
buffer
为数据缓冲对象,是一个类似数组结构的对象,可以通过指定开始写入的位置及写入的数据长度,往其中写入二进制数据,
所以buffer是一段存储字节流的内存区;
stream
是对buffer对象的高级封装,其操作的底层还是buffer对象,stream可以设置为可读、可写,或者即可读也可写,
在nodejs中继承了EventEmitter接口,可以监听读入、写入的过程。具体实现有文件流,httpresponse等