日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JS 字节流 解析

發布時間:2023/12/29 javascript 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JS 字节流 解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • JS 源碼
  • 使用步驟
  • 總結


前言

提示:最近作者在工作之余,遇到了關于字節數據傳輸,前端解析數據的問題,為此寫了一個用于處理該類問題的 js 庫。


提示:以下是本篇文章正文內容,下面案例可供參考

JS 源碼

代碼如下(示例):

var BOOL_TYPE = 0, // BoolINT8_TYPE = 1, // CharUINT8_TYPE = 2, // UCharINT16_TYPE = 3, // ShortUINT16_TYPE = 4, // UShortINT32_TYPE = 5, // IntINT64_TYPE = 6 // LongUINT32_TYPE = 7, // UIntFLOAT32_TYPE = 8, // FloatFLOAT64_TYPE = 9, // DoubleBYTE_TYPE = 10, // ByteStr_TYPE = 11; // type:數據類型, Bin:二進制流,begin:數據起始位置(字節),Num: 1 function TypedArrays(Type, Bin) {//, begin, Num//var _num = 1;switch (Type) {case BOOL_TYPE: return Bin[0] == 1 ? true : false;case INT8_TYPE: return toInt8(Bin); case UINT8_TYPE: return toUint8(Bin); case INT16_TYPE: return toInt16(Bin); case UINT16_TYPE: return toUint16(Bin); case INT32_TYPE: return toInt32(Bin); case INT64_TYPE: return toInt64(Bin); case UINT32_TYPE: return toUint32(Bin); case FLOAT32_TYPE: return toFloat32(Bin);case FLOAT64_TYPE: return toFloat64(Bin);case BYTE_TYPE: return toBytes(Bin);case Str_TYPE: return toString(Bin);default: return -1;} }// 截取指定大小數據并轉換成指定的數據類型 function ByteToType(Type, Bin, begin, Num) {return TypedArrays(Type, Bin.splice(begin, Num));//, begin, Num); }// 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);elsereturn MsgName;Index++;}return MsgName; } function byteToString(arr) {if (typeof arr === 'string') {return arr;}var str = '',_arr = arr;for (var i = 0; i < _arr.length; i++) {var one = _arr[i].toString(2),v = one.match(/^1+?(?=0)/);if (v && one.length == 8) {var bytesLength = v[0].length;var store = _arr[i].toString(2).slice(7 - bytesLength);for (var st = 1; st < bytesLength; st++) {if (_arr.length > i + st) {store += _arr[st + i].toString(2).slice(2);} else {store = '000000';}}str += String.fromCharCode(parseInt(store, 2));i += bytesLength - 1;} else {str += String.fromCharCode(_arr[i]);}}return str; }//構建一個視圖,把字節數組寫到緩存中,索引從0開始,大端字節序 function getView(bytes) {var view = new DataView(new ArrayBuffer(bytes.length));for (var i = 0; i < bytes.length; i++) {view.setUint8(i, bytes[i]);}return view; }function toString(bytes) {//var data = getView(bytes);return byteToString(bytes); }//對應數組,或單數結果 function toBytes(bytes) {if (bytes.length > 1) {return bytes;} else {return bytes[0];} } //將字節數組轉成有符號的8位整型,大端字節序 function toInt8(bytes) {return getView(bytes).getInt8(); } //將字節數組轉成無符號的8位整型,大端字節序 function toUint8(bytes) {return getView(bytes).getUint8(); } //將字節數組轉成有符號的16位整型,大端字節序 function toInt16(bytes) {return new Int16Array(getView(bytes).buffer, 0, 1)[0]; } //將字節數組轉成無符號的16位整型,大端字節序 function toUint16(bytes) {return new Uint16Array(getView(bytes).buffer, 0, 1)[0]; } //將字節數組轉成有符號的32位整型,大端字節序 function toInt32(bytes) {return new Int32Array(getView(bytes).buffer, 0, 1)[0]; } //將字節數組轉成無符號的32位整型,大端字節序 function toUint32(bytes) {return new Uint32Array(getView(bytes).buffer, 0, 1)[0]; } //將字節數組轉成有符號的64位整型,大端字節序 function toInt64(bytes) {return new BigInt64Array(getView(bytes).buffer, 0, 1)[0]; } //將字節數組轉成有符號的64位整型,大端字節序 function toUint64(bytes) {return new BigUint64Array(getView(bytes).buffer, 0, 1)[0]; } //將字節數組轉成32位浮點型,大端字節序 function toFloat32(bytes) {return getView(bytes).getFloat32(); } //將字節數組轉成64位浮點型,大端字節序 function toFloat64(bytes) {return new Float64Array(getView(bytes).buffer, 0, 1)[0]; } //將數值寫入到視圖中,獲得其字節數組,大端字節序 function getUint8Array(len, setNum) {var buffer = new ArrayBuffer(len); //指定字節長度setNum(new DataView(buffer)); //根據不同的類型調用不同的函數來寫入數值return new Uint8Array(buffer); //創建一個字節數組,從緩存中拿取數據 } //得到一個8位有符號整型的字節數組,大端字節序 function getInt8Bytes(num) {return getUint8Array(1, function (view) { view.setInt8(0, num); }) } //得到一個8位無符號整型的字節數組,大端字節序 function getUint8Bytes(num) {return getUint8Array(1, function (view) { view.setUint8(0, num); }) } //得到一個16位有符號整型的字節數組,大端字節序 function getInt16Bytes(num) {return getUint8Array(2, function (view) { view.setInt16(0, num); }) } //得到一個16位無符號整型的字節數組,大端字節序 function getUint16Bytes(num) {return getUint8Array(2, function (view) { view.setUint16(0, num); }) } //得到一個32位有符號整型的字節數組,大端字節序 function getInt32Bytes(num) {return getUint8Array(4, function (view) { view.setInt32(0, num); }) } //得到一個32位無符號整型的字節數組,大端字節序 function getUint32Bytes(num) {return getUint8Array(4, function (view) { view.setUint32(0, num); }) } //得到一個32位浮點型的字節數組,大端字節序 function getFloat32Bytes(num) {return getUint8Array(4, function (view) { view.setFloat32(0, num); }) } //得到一個64位浮點型的字節數組,大端字節序 function getFloat64Bytes(num) {return getUint8Array(8, function (view) { view.setFloat64(0, num); }) }

使用步驟

代碼如下(示例):

ByteToType(INT32_TYPE, [0,1,1,2], 0, 4); //轉換類型 int32,源數據,取值下標,取幾位

總結

提示:以上簡單示例,僅為模板,大家可以有自己更好的思路哦。

總結

以上是生活随笔為你收集整理的JS 字节流 解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。