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);