zoukankan      html  css  js  c++  java
  • Node.js之使用Buffer类处理二进制数据

    Node.js之使用Buffer类处理二进制数据

    Buffer类可以在处理TCP流或文件流时处理二进制数据,该类用来创建一个专门存放二进制数据的缓存区。

    1. 创建Buffer对象

    1.1 直接创建:

    	bur = new BUffer(123) //123 为bur缓存区长度
    

    1.2 初始化缓存区内容可以用fill属性:

    	bur.fill(value,[offset],[end])
    	//value:为必填参数,数值为需要写入的数值
    	第二个参数为数据写入的起始位置,默认为0
    	第三个参数为数据写入的终止位置,默认为最尾端
    

    1.3 填充数据可以直接填入数组

    	bur = new Buffer(array)
    

    1.4 Buffer类还可以用字符串填充:

    	bur = new Buffer(str,[encoding])
    	//第一个参数为必填参数,为字符串
    	第二个参数为指定文字编码格式,默认为utf8
    	还可以为:
    
    编码 说明 编码 说明
    ascii ASCII字符串说明 base64 经过BASE64编码后的字符串
    utf8 UTF-8字符串 binary 二进制数据(不推荐使用)
    utf16le UTF-16LE字符串 hex 使用16进制数值表示的字符串
    ucs2 UCS2字符串

    2. 字符串的长度与缓存区的长度

    字符串的长度与缓存区的长度是不同的,字符串定义后,不能改变,但在缓存区可以改变一些值,例如:
    
    [root@kuber3 ~]# node
    > str = '我是谁'
    '我是谁'
    > bur = new Buffer(str)
    <Buffer e6 88 91 e6 98 af e8 b0 81>
    > str.length
    3
    > bur.length
    9
    > str[1] ='yuan'
    'yuan'
    > str
    '我是谁'
    
    
    
    > str = '我是谁'
    '我是谁'
    > fur = new Buffer(str)
    <Buffer e6 88 91 e6 98 af e8 b0 81>
    > fur[0] = 0
    0
    > fur
    <Buffer 00 88 91 e6 98 af e8 b0 81>
    > 
    

    利用slice对象可以选出指定为对象,但在缓存中slice出的对象即是元数据。缓存区中的真实值,随意一旦改变,缓存区中的值也会变:

    > buf = new Buffer('我爱你')
    <Buffer e6 88 91 e7 88 b1 e4 bd a0>
    > subBuf = buf.slice(1,3)
    <Buffer 88 91>
    > subBuf[0] = 0
    0
    > subBuf
    <Buffer 00 91>
    > buf
    <Buffer e6 00 91 e7 88 b1 e4 bd a0>
    > 
    

    3. Buffer对象与字符串对象之间的相互转换

    3.1 Buffer对象的toString可以将Buffer对象那个转换为字符串,

    	buf。toString([encoding],[start],[end])
    	//第一个参数用于指定Buffer对象保存的文字编码格式
    	第二个与第三个为被转换数据的起始地址和终止地址
    

    3。2 Buffer对象的write方法

    如果需要向已创建的Buffer对象中写入字符串,这时可以使用write方法:

    	buf.write(string,[offfset],[length],[encodind])
    	//第一个参数为必填参数:为需要写入的字符串
    	第二个与第三个参数为字符串的写入位置 offset+1~offset+length
    	第四个参数为写入字符串使用的编码格式
    

    3.3 StringDecoder 对象

    其作用与toString相同,但需要引入string_decoder模块

    var StringDecoder = require('string_decoder').StringDecoder
    var decoder = new StringDecoder([encoding])
    	//c参数为制定转换字符串时所用的编码格式,默认为utf8
    

    利用StringDecoder.write可以将Buffer对象中数据转换成字符串

    decoder.write(buffer)
    

    4. Buffer对象与数值对象之间的相互转换 读写Buffer对象中的数据所有方法

    方法名 数据类型
    buf.readUInt8(offset,[noAssert]) 8位无符号整数
    buf.writeUInt8(value,offset,[noAssert])
    buf.readUInt16LE(offset,[noAssert]) 16位无符号整数(Little Endian)
    buf.writeUInt16LE(value,offset,[noAssert])
    buf.readUInt16BE(offset,[noAssert]) 16位无符号整数(Big Endian)
    buf.writeUInt16BE(value,offset,[noAssert])
    buf.readUInt32LE(offset,[noAssert]) 32位无符号整数(Little Endian)
    buf.writeUInt32LE(value,offset,[noAssert])
    buf.readUInt32BE(offset,[noAssert]) 32位无符号整数(Big Endian)
    buf.writeUInt32BE(value,offset,[noAssert])
    buf.readInt8(offset,[noAssert]) 8位有符号整数
    buf.writeInt8(value,offset,[noAssert])
    buf.readInt16LE(offset,[noAssert]) 16位有符号整数(Little Endian)
    buf.writeInt16LE(value,offset,[noAssert])
    buf.readInt16BE(offset,[noAssert]) 16位有符号整数(Big Endian)
    buf.writeInt16BE(value,offset,[noAssert])
    buf.readInt32LE(offset,[noAssert]) 32位有符号整数(Little Endian)
    buf.writeInt32LE(value,offset,[noAssert])
    buf.readInt32BE(offset,[noAssert]) 32位有符号整数(Big Endian)
    buf.writeInt32BE(value,offset,[noAssert])
    buf.readFloatLE(offset,[noAssert]) 单精度浮点数(Little Endian)
    buf.writeFloatLE(value,offset,[noAssert])
    buf.readFloatBE(offset,[noAssert]) 单精度浮点数(Big Endian)
    buf.writeFloatBE(value,offset,[noAssert])
    buf.readDoubleLE(offset,[noAssert]) 倍精度浮点数(Little Endian)
    buf.writeDoubleLE(value,offset,[noAssert])
    buf.readDoubleBE(offset,[noAssert]) 倍精度浮点数(Big Endian)
    buf.writeDoubleBE(value,offset,[noAssert])
    其中read方法中第一个参数[offset]表示获取数据的起始位,单位为字节;第二个参数[noAssert]为一布尔值,表示是否对offset值进行验证,false:如果offset参数超出缓存区长度,则抛出异常,为true时,不抛出异常
    其中write方法第一个参数value为需要写入的整数,第二个参数offset指定数据起始写入的位置;第三个参数为布尔型,false:如果offset参数值超出缓存区的长度,会抛出异常,为true不会抛出异常

    5. BUffer对象与JSON对象之间的相互转换

    在NOde.js中,可以使用JSON.stringify方法将Buffer对象中保存的数据转换为一个字符串,也可以使用JSON.parse方法将一个经过转换后的字符串还原为一个数组
    eg:

    [root@kuber3 ~]# node
    > buf = new Buffer('我爱你')
    <Buffer e6 88 91 e7 88 b1 e4 bd a0>
    > json= JSON.stringify(buf)
    '{"type":"Buffer","data":[230,136,145,231,136,177,228,189,160]}'
    > copy = new Buffer(JSON.parse(json))
    <Buffer e6 88 91 e7 88 b1 e4 bd a0>
    > copy.toString();
    '我爱你'
    > 
    

    6. 复制缓存数据

    将一个BUffer对象保存到两一个Bufer对象中可利用copy方法:

    buf.copy(targetBuffer,[targetStart],[sourceStart],[sourceEnd])
    //第一个参数:必选,指定复制目标Buffer对象
    第二个参数:指定目标Buffer对象中从第几个字节开始写入,默认为0
    第三个参数:指定复制源Buffer对象中获取数据的起始位置,默认为0
    第四个参数:指定从复制源Buffer对象中获取数据的结束位置,默认为复制源Buffer的长度
    

    7. Buffer类的方法

    7.1 isBuffer方法 判断是否为一个Buffer对象

    Buffer.isBuffer(obj)
    

    7.2 byteLength方法 计算一个指定字符串的字节数

    Buffer.byteLength(string,[encoding])
    //d第一个参数:必选,指定需要计算字节数的字节符
    第二个参数:按什么编码来计算字节数,默认为utf8
    

    7.3 concat方法 将几个Buffer对象结合创建一个新的Buffer对象

    Buffer。concatenate(list,【totalLength】)
    //第一个参数:必选 为一个存放多个Buffer对象的数组
    第二个参数:指定被创建的Buffer对象的总长度
    

    7.4 isEncoding方法 用于检测一个字符串是否为一个有效的编码格式字符串

    Buffer.isEncoding(encoding)
  • 相关阅读:
    Android listview 的应用
    Android 创建自定义布局
    Android Dialog
    android ProgressBar
    Lilac Pwn stack4-stack_pivoting Writeup
    CTFHUB Pwn ret2shellcode Writeup
    Lilac Pwn stack3-rop Writeup
    函数调用过程与栈帧结构
    线性回归及Python实现
    Google Kick Start Round A 2020
  • 原文地址:https://www.cnblogs.com/yuanchenghao/p/7420086.html
Copyright © 2011-2022 走看看