• Nodejs Buffer


    javascript中的字符串本身就是以字符来存储,而非字节,下面的例子可以说明:

    1 console.log("0123456789".length); // 10
    2 console.log("零一二三四五六七八九".length); /10
    3 console.log("u00bd".length); // 1

    尽管在计算机内部,一个中文字和一个英文字占用的字节位数是不同的,但对于用户而言,它们拥有相同的长度。我认为这是JavaScript中 String处理得精彩的一个点。

        对 于JavaScript来说,对Unicode编码的数据很容易处理的但是对于二进制数据就没什么处理方法了。但是在一些TCP数据流或者在操作一些文件 数据流的时候,字节流的处理方法还是必须的。nodeJS中便出了处理的策略方法~提供了与String类似对等的全局构造函数Buffer。一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。Buffer 不能调整大小。

    许多地方的数据流均是使用的Buffer类型,以便于来处理一些二进制数据;

    一 个中文字占了3个Buffer单位,但是在数据流分块的时候将一个中文的3个标识分开,再做 toString的时候救会发生出现这种乱码的情况。解决方式就是在拿到的分块数据千万不能直接进行类似toString式转义,将每段Buffer保 存,最后合并成一个大的Buffer后在进行转义。例如下例:

    var fs = require('fs');
    var encodingConvert     = require('encoding');
    var buf                 = require('buffer');
    var a = new Buffer("苏A00001");
    console.log(a);
    console.log(a.toString());

    运行结果如下:

     其中的e8 8b 8f就代表苏这个汉字。

    创建Buffer实例的方式:

    new Buffer( size );
        和数组类似,给定所需要创建Buffer对象的大小。

    new Buffer( array );
        给定二进制数据的一个数组形式排列

     new Buffer( str, [ encoding ] );
        给与某一特定数据类型数据,以及其编码类型(默认均为utf8)。

    操作Buffer实例的方法:

        一个Buffer的形式非常类似于一个整数数组,与字符串还是有一定的区别的。

        一个Buffer的形式非常类似于一个整数数组,与字符串还是有一定的区别的。
        对于字符串来说可以视为可读的,每次的修改,复制都会得到一个新的字符串,不会影响之前的字符串,就如有一个字符串a,将 var b = a;  a 和 b 是各会拥有独立的一份字符串数据,相互独立。

        在将创建的Buffer截取一段之后,对返回的Buffer段进行修改,还是会影响原Buffer,两者仍是关联的。这类似于一个储存一个个对象的数组,Buffer这个类数组中每一个元素非原始值,而是引用值。

       对于希望复制一份独立的Buffer拷贝,Buffer提供了专门的方法:
       Buffer.copy(targetBuffer, [targetStart], [sourceStart], [sourceEnd]);
    在缓冲区之间使用 memcpy() 进行复制。

       示例:建立两个缓冲区,然后复制 buf1 第 16 到 19 字节的数据到 buf2 的第 8 字节处。

       

     1 buf1 = new Buffer(26);
     2 buf2 = new Buffer(26);
     3 
     4 for (var i = 0 ; i < 26 ; i++) {
     5   buf1[i] = i + 97; // 97 is ASCII a
     6   buf2[i] = 33; // ASCII !
     7 }
     8 
     9 buf1.copy(buf2, 8, 16, 20);
    10 console.log(buf2.toString('ascii', 0, 25));
    11 
    12 // !!!!!!!!qrst!!!!!!!!!!!!!

     

  • 相关阅读:
    NYOJ题目916胖子小的百宝袋
    NYOJ题目893十字架
    NYOJ题目874签到
    设计模式之Singleton
    Elo rating system 模拟
    JDBC之SqlHelper
    《Thinking in Java》十四章类型信息_习题解
    NYOJ题目842整除的尾数
    NYOJ题目840吃花生
    NYOJ题目839合并
  • 原文地址:https://www.cnblogs.com/cocos2014/p/4281464.html
Copyright © 2020-2023  润新知