• 计算机重要概念:进制,字节,字符,编码,缓冲,流


    字节

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

    十进制数,没有前缀
    二进制数,前缀是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码表示,若是数字,则用一个字节的二进制数标识。在流入流出时,对 符号不进行变换。

    计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。

    1,字节流(二进制流)和字符流(文本流)

    2,输入流(读取),输出流(写入),双工流(读写),可转换(读写+转换)流

    3,buffer和stream:stream是对buffer的封装,操作的还是buffer

    buffer
    为数据缓冲对象,是一个类似数组结构的对象,可以通过指定开始写入的位置及写入的数据长度,往其中写入二进制数据,
    所以buffer是一段存储字节流的内存区;
    stream 是对buffer对象的高级封装,其操作的底层还是buffer对象,stream可以设置为可读、可写,或者即可读也可写,
    在nodejs中继承了EventEmitter接口,可以监听读入、写入的过程。具体实现有文件流,httpresponse等
  • 相关阅读:
    BlogEngine.Net架构与源代码分析系列part5:对象搜索——IPublishable与Search
    SqlCacheDependency
    Office SharePoint Server 2007
    Castle Active Record for .NET2.0快速入门示例
    PetShop的系统架构第三篇
    中文分词核心配置
    BlogEngine.Net架构与源代码分析系列part3:数据存储——基于Provider模式的实现
    Cocos2d开发系列(二)
    高负载、高并发网站架构知识汇总大流量网站架构的几点认识
    使用Application变量
  • 原文地址:https://www.cnblogs.com/tkzc2013/p/14468140.html
Copyright © 2020-2023  润新知