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
解析汇总:
var INT8_TYPE = 1, // Char
UINT8_TYPE = 2, // UChar
INT16_TYPE = 3, // Short
UINT16_TYPE = 4, // UShort
INT32_TYPE = 5, // Int / Bool
UINT32_TYPE = 6, // UInt
FLOAT32_TYPE = 7, // Float
FLOAT64_TYPE = 8; // Double
// type:数据类型, Bin:二进制流,begin:数据起始位置(字节),Num: 1
function TypedArrays(Type,Bin,begin,Num)
{
switch(Type)
{
case INT8_TYPE: return new Int8Array(Bin, begin ,Num)[0];
case UINT8_TYPE: return new Uint8Array(Bin, begin ,Num)[0];
case INT16_TYPE: return new Int16Array(Bin, begin ,Num)[0];
case UINT16_TYPE: return new Uint16Array(Bin, begin ,Num)[0];
case INT32_TYPE: return new Int32Array(Bin, begin ,Num)[0];
case UINT32_TYPE: return new Uint32Array(Bin, begin ,Num)[0];
case FLOAT32_TYPE: return new Float32Array(Bin, begin ,Num)[0];
case FLOAT64_TYPE: return new Float64Array(Bin, begin ,Num)[0];
default: return -1;
}
}
// ASCII to char
function ASCII2Char(v){ return String.fromCharCode(v);}
// ASCII to string
function ASCII2Str(Bin,StartByte,Type,MsgLen)
{
var MsgName = "";
var Index = 0;
while(Index<MsgLen)
{
var AsciiValue = TypedArrays(Type,Bin,StartByte,1); StartByte += 1;
if(AsciiValue!=0)
MsgName+=ASCII2Char(AsciiValue);
else
return MsgName;
Index++;
}
return MsgName;
}
例如解析一个char型数值:
var StartByte = 0;
var DataName = TypedArrays(INT8_TYPE, Bin, StartByte,1);
例如解析一个char型的字符串:
var StartByte = 0;
var string = ASCII2Str(Bin, 0, INT8_TYPE, 64); // 二进制数据,起始位置,数据类型,该char型所占的字节数