身为前端大佬,总得处理各式各样的数据格式,尤其是二进制这块儿。今儿就来聊聊我用JavaScript玩转二进制数据的那些事儿,希望能帮到你们!
理解二进制数据的重要性
var socket=new WebSocket("ws://192.168.0.147");
现在,做网页开发的时候碰到二进制数据的情况特别多。比如接收WebSocket传来的信息,或者处理照片和文档这些东西,懂得怎么玩转二进制数据就显得很重要了。毕竟,能把这活玩得利索,应用运行起来快,用户也高兴不是?
创建和配置WebSocket
用WebSocket聊天,第一步就是创建WebSocket对象。重要的一步是给它设定个`binaryType`参数,用来指定从WebSocket接收的二进制信息要怎么处理。一般来说,咱们就选那个叫`”arraybuffer”`的,这样在保证速度快的同时也能有更多选择。
使用ArrayBuffer和DataView操作数据
在JavaScript里面,你可能会遇到ArrayBuffer这种东西,它就是个能装固定大小二进制原始数据的大容器。要是想仔细摆弄这个缓冲区里的数据怎么办?这时候就要用上DataView。它就像个小助手,让你按自己喜欢的顺序存取和修改缓冲区里的数据,尤其适合处理网络上那些乱七八糟的信息。
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] }
发送二进制数据
咱们平时发信息就是先把内存弄出来,DataView就是用来填充这个地方的。用它就像点菜下单一样,比如”setUint8″或者”setInt16″,就能准确无误地把数据塞进内存里了。
接收和处理二进制数据
var loginBuffer=new ArrayBuffer(30); var loginDataview=new DataView(loginBuffer); //localstorageuserinfo为缓存在本地的用户手机号 var telArr=localstorageuserinfo.TelPhone; var loginTime=tempTrans(); for(var i=0;i3&&i19&&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; }
要接收二进制数据得先设置好WebSocket里的`binaryType`,这样收到的数据才能变成我们熟悉的JavaScript对象。如果选了`”arraybuffer”`的话,就得用DataView来读数据,这样就能按照需求把数据按各种格式和顺序解析出来。
错误处理和调试技巧
遇到那些二进制数据里的错综复杂问题,比如字节顺序乱七八糟,再或者数据格式对不上号,那得有一套自己的调试秘籍才行!就像用浏览器的开发工具监控一下网页的网络请求和回应,或者用断点慢慢追踪代码的运行过程,这些都是很实用的小技巧。
性能优化和最佳实践
要让应用跑得更快,关键是搞定二进制数据那点儿事:选好缓冲区大小,把数据读写弄流畅点,少做那些没用的内存复制。还有,别忘了遵守一些小窍门,比如尽量少转几次数据,这样也能大大提速!
结合实际案例的学习
搞明白道理还得干活儿才行!所以我准备举几个例子来说说怎么把这些知老活用到实操里面去。通过编代码和调毛病,咱们才能更透彻地了解到怎么处理二进制数据。
//接收消息onmessage socket.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; }); }) }
看了这篇文章后,你应该能搞懂JavaScript怎么处理二进制数据了。这个技能在平常处理数据时非常实用,而且还能帮你提高技术水平。那么,你在自己的项目中有遇到过处理二进制数据的情况吗?快来评论区分享下你的经历和疑惑,咱们一起探讨学习!觉得这篇文章有用的话就点个赞分享出去,让更多的朋友受益。
评论0