js操作二进制数据方法
最近做了几个项目,用js操作二进制数据,通过socket与后台进行传输。在此用博客做个记录
首先是新建一个socket:
varsocket=newWebSocket("ws://192.168.0.147");
接着定义socket打开,连接之后执行的函数:
websocket有个属性binaryType,可将其设置为“blob”或者“arraybuffer”,默认格式为“blob”,做项目的时候忘记设置为“arraybuffer”了,结果在下面接收数据的时候就需要用Blob对象来接。
socket.onopen=function(){ //发送登录帧,4-20位为手机号 varloginArr=[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发送出去:
varloginBuffer=newArrayBuffer(30); varloginDataview=newDataView(loginBuffer); //localstorageuserinfo为缓存在本地的用户手机号 vartelArr=localstorageuserinfo.TelPhone; varloginTime=tempTrans(); for(vari=0;i3&&i<(telArr.length+4)){ loginDataview.setInt8(i,telArr.charCodeAt(i-4)); } if(i>19&&i =0;i--){ uint8.push(u32Dataview.getUint8(i)) } uint8.push(newDataView(newUint8Array([time.getMonth()+1]).buffer).getUint8(0)); uint8.push(newDataView(newUint8Array([time.getDate()]).buffer).getUint8(0)); uint8.push(newDataView(newUint8Array([time.getHours()]).buffer).getUint8(0)); uint8.push(newDataView(newUint8Array([time.getMinutes()]).buffer).getUint8(0)); uint8.push(newDataView(newUint8Array([time.getSeconds()]).buffer).getUint8(0)); returnuint8; }
发送的流程大概就是这样,先newArrayBuffer对象,该对象需要填入缓冲区长度参数,具体查看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
下面是接收数据处理:
//接收消息onmessage socket.onmessage=function(data){ varblob_=newBlob([data.data]); parseBlob(blob_); } //使用fileReader操作blob对象 varreader={ readAs:function(type,blob,cb){ varr=newFileReader(); r.onloadend=function(){ if(typeof(cb)==='function'){ cb.call(r,r.result); } } try{ r['readAs'+type](blob); }catch(e){} } } functionparseBlob(blob){ reader.readAs('ArrayBuffer',blob.slice(0,blob.size),function(arr){ vardataview_=newDataView(arr); //协议中第二位是判断数据来源的 varsocketConType=dataview_.getUint8(1); //转成字符串读取数据 varmodulelength=(dataview_.buffer.byteLength-46)/33; varmodulestate={}; 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操作二进制数据方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。