计算机:进制,字节,字符,编码,缓冲,流

字节

整数各种进制的字面量如下:

十进制数,没有前缀
二进制数,前缀是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是一种基于64个可打印字符来表示二进制数据的表示方法。
由于2的6次方=64,所以每6个比特为一个单元,对应某个可打印字符。3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。
Base64的编码转换方式:所谓Base64,就是说选出64个字符----小写字母a-z、大写字母A-Z、数字0-9、符号"+"、"/"(再加上作为垫字的"=",实际上是65个字符)----作为一个基本字符集。然后,其他所有符号都转换成这个字符集中的字符。
base64_encode()
base65_decode()

6,URL编码

URL编码并不会对所有的字符都进行编码,而是只会对特殊字符进行编码。在ASCII编码0x20 ~ 0x7e范围内的一部分字符和范围外的所有字符都会被url编码,同时也包括汉字等其他文字。
urlencode()
特殊字符的转换,
# 用来标志特定的文档位置 %23
% 对特殊字符进行编码 %25
& 分隔不同的变量值对 %26
+ 在变量值中表示空格 %2B
\ 表示目录路径 %5C
= 用来连接键和值 %3D
? 表示查询字符串的开始 %3F

urldecode()
字符串中的任何 %##。加号('+')被解码成一个空格字符

7,Hex编码

十六进制编码,Hex编码就是把一个8位的字节数据用两个十六进制数展示出来,编码时,将8位二进制码重新分组成两个4位的字节,其中一个字节的低4位是原字节的高四位,另一个字节的低4位是原数据的低4位,高4位都补0,然后输出这两个字节对应十六进制数字作为编码,Hex编码后的长度是源数据的2倍。
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等

 

posted @ 2021-03-02 11:39  小匡程序员  阅读(427)  评论(0编辑  收藏  举报