国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

js操作二進制數據方法

2019-11-19 14:14:55
字體:
來源:轉載
供稿:網友

最近做了幾個項目,用js操作二進制數據,通過socket與后臺進行傳輸。在此用博客做個記錄

首先是新建一個socket:

var socket=new WebSocket("ws://192.168.0.147");

接著定義socket打開,連接之后執行的函數:

websocket有個屬性binaryType,可將其設置為“blob”或者“arraybuffer”,默認格式為“blob”,做項目的時候忘記設置為“arraybuffer”了,結果在下面接收數據的時候就需要用Blob對象來接。

socket.onopen=function(){ //發送登錄幀,4-20位為手機號 var loginArr=[0X02,0X02,0X00,0X1E,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0D,0X0A]        }

下面是轉成bype發送出去:

var loginBuffer=new ArrayBuffer(30);var loginDataview=new DataView(loginBuffer);//localstorageuserinfo為緩存在本地的用戶手機號var telArr=localstorageuserinfo.TelPhone; var loginTime=tempTrans();for(var i=0;i<loginArr.length;){ loginDataview.setInt8(i,loginArr[i]); if(i>3&&i<(telArr.length+4)){   loginDataview.setInt8(i,telArr.charCodeAt(i-4)); }    if(i>19&&i<loginArr.length-2){  loginDataview.setInt8(i,loginTime[i-20]); } i++;}//登錄包socket.send(loginDataview.buffer);   //格式化時間同時按照年倆位月日時分秒1位由高到底排序function tempTrans(time){ if(!time){  time=new Date(); } var u32Dataview=new DataView(new Uint16Array([time.getFullYear()]).buffer); var uint8=[]; uint8.push(new DataView(new Uint8Array([0X00]).buffer).getUint8(0)) for(var i=u32Dataview.byteLength-1;i>=0;i--){  uint8.push(u32Dataview.getUint8(i)) } uint8.push(new DataView(new Uint8Array([time.getMonth()+1]).buffer).getUint8(0)); uint8.push(new DataView(new Uint8Array([time.getDate()]).buffer).getUint8(0)); uint8.push(new DataView(new Uint8Array([time.getHours()]).buffer).getUint8(0)); uint8.push(new DataView(new Uint8Array([time.getMinutes()]).buffer).getUint8(0)); uint8.push(new DataView(new Uint8Array([time.getSeconds()]).buffer).getUint8(0)); return uint8;}

發送的流程大概就是這樣,先new ArrayBuffer對象,該對象需要填入緩沖區長度參數,具體查看api==> https://msdn.microsoft.com/zh-cn/library/br212474(v=vs.94).aspx,

然后新建DataView對象,將ArrayBuffer傳進去。然后用DataView的setUint和getUint方法按位進行讀取設置,具體參考api==> https://msdn.microsoft.com/zh-cn/library/br212463(v=vs.94).aspx

下面是接收數據處理:

//接收消息onmessagesocket.onmessage=function(data){  var blob_=new Blob([data.data]);  parseBlob(blob_); }//使用fileReader操作blob對象var reader = {  readAs: function(type,blob,cb){  var r = new FileReader();  r.onloadend = function(){    if(typeof(cb) === 'function') {    cb.call(r,r.result);    }  }  try{    r['readAs'+type](blob);  }catch(e){}  }}function parseBlob(blob){ reader.readAs('ArrayBuffer',blob.slice(0,blob.size),function(arr){   var dataview_=new DataView(arr);   //協議中第二位是判斷數據來源的   var socketConType=dataview_.getUint8(1);   //轉成字符串讀取數據   var modulelength=(dataview_.buffer.byteLength-46)/33;   var modulestate={};    reader.readAs('Text',blob.slice(i*33+37,i*33+37+32),function(result){    modulestate[dataview_.getUint8(i*33+36)]=result;   }); })}

轉成字符串之后就可以為所欲為了。

以上就是我做項目時用到的操作二進制數據的方法,按位讀取頭都要炸了??????google開源的protobuf能夠設置完數據格式之后,所有讀取操作都不用自己拼接了,非常舒服。不過不懂后臺技術,我只能跟在后臺大佬后面吃饃渣 TnT

這篇js操作二進制數據方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 瑞金市| 章丘市| 乌鲁木齐市| 贵阳市| 永新县| 陈巴尔虎旗| 云林县| 南京市| 涪陵区| 海晏县| 延川县| 肃宁县| 竹北市| 西城区| 崇信县| 石泉县| 保康县| 聂荣县| 濉溪县| 邻水| 教育| 高邑县| 蓬溪县| 灌云县| 武安市| 德令哈市| 奉新县| 加查县| 长顺县| 斗六市| 平乐县| 尖扎县| 海伦市| 策勒县| 桐城市| 电白县| 凌海市| 措美县| 来宾市| 安塞县| 冕宁县|