JS解析二进制数据流

博客介绍了JS解析二进制流的相关内容,使用TypeArray函数,其参数包括ArrayBuffer、偏移量和数据长度。还给出两种解析方法,一是用slice截取,CPU使用率高;二是通过偏移量解析,推荐使用。此外,介绍了解析数值、字符串的方法及汇总示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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型所占的字节数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值