JS解析二进制数据流

JS解析二进制流使用函数TypeArray(buffer, byteOffset,length):第一个参数是ArrayBuffer,第二个参数是偏移量(以字节计),第三个参数是数据的长度(以字节计)。

TypeArray详细参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/TypedArray

TypeArray类型有:Int8, Uint8, Int16, Uint16, Int32, Uint32, Float32, Float64

方法一:通过slice截取arraybuffer一段相应的数据,slice会截取数据复制到一个新的内存区域来解析,此方法CPU使用率高。

解析数值: 

new Int32Array(buffer.slice(begin),0,Num)[0]; // begin:起始位置,Num:数据长度

方法二:通过arraybuffer偏移量来解析相应数据,不需要另外开辟空间来解析,建议采用此方法。

new Int32Array(buffer, begin ,Num)[0];

解析字符串:采用String.fromCharCode()方法

先将对应的二进制解析成ASCII码数值,然后采用String.fromCharCode()方法解析成对应的ASCII值。例如ASCII表69表示E。

String.fromCharCode(69); // E
 

解析汇总:

// type:数据类型, Bin:二进制流,begin:数据起始位置(字节),Num: 1

function TypedArrays(Type,Bin,begin,Num)
{    
    switch(Type)
    {
        case INT8_TYEP:    return new Int8Array(Bin, begin ,Num)[0];
        case UINT8_TYEP:   return new Uint8Array(Bin, begin ,Num)[0];
        case INT16_TYEP:   return new Int16Array(Bin, begin ,Num)[0];
        case UINT16_TYEP:  return new Uint16Array(Bin, begin ,Num)[0];
        case INT32_TYEP:   return new Int32Array(Bin, begin ,Num)[0];
        case UINT32_TYEP:  return new Uint32Array(Bin, begin ,Num)[0];
        case FLOAT32_TYEP: return new Float32Array(Bin, begin ,Num)[0];
        case FLOAT64_TYEP: return new Float64Array(Bin, begin ,Num)[0];
        default: return -1;
    }
}

例如解析一个char型:

var StartByte = 0;

var DataName = TypedArrays(INT8_TYEP, Bin, StartByte,1);

你可能感兴趣的:(JS解析二进制)