js操作二进制数据方法


Posted in Javascript onMarch 03, 2018

最近做了几个项目,用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

下面是接收数据处理:

//接收消息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;
 
});
 })
}

转成字符串之后就可以为所欲为了。

以上就是我做项目时用到的操作二进制数据的方法,按位读取头都要炸了······google开源的protobuf能够设置完数据格式之后,所有读取操作都不用自己拼接了,非常舒服。不过不懂后台技术,我只能跟在后台大佬后面吃馍渣 TnT

这篇js操作二进制数据方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
IE DOM实现存在的部分问题及解决方法
Jul 25 Javascript
JQuery结合CSS操作打印样式的方法
Dec 24 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
Nov 30 Javascript
Javascript中匿名函数的调用与写法实例详解(多种)
Jan 26 Javascript
js贪吃蛇游戏实现思路和源码
Apr 14 Javascript
jQuery移动端图片上传组件
Jun 12 Javascript
微信小程序 跳转传参数与传对象详解及实例代码
Mar 14 Javascript
JavaScript限定范围拖拽及自定义滚动条应用(3)
May 17 Javascript
详解微信小程序 登录获取unionid
Jun 27 Javascript
[原创]微信小程序获取网络类型的方法示例
Mar 01 Javascript
详解JS实现简单的时分秒倒计时代码
Apr 25 Javascript
react国际化react-intl的使用
May 06 Javascript
vue2.0使用swiper组件实现轮播的示例代码
Mar 03 #Javascript
Vue的轮播图组件实现方法
Mar 03 #Javascript
在Vue中使用Compass的方法
Mar 02 #Javascript
AjaxUpLoad.js实现文件上传功能
Mar 02 #Javascript
关闭Vue计算属性自带的缓存功能方法
Mar 02 #Javascript
解决vue 更改计算属性后select选中值不更改的问题
Mar 02 #Javascript
完美解决iview 的select下拉框选项错位的问题
Mar 02 #Javascript
You might like
phpmyadmin 访问被拒绝的真实原因
2009/06/15 PHP
php页面防重复提交方法总结
2013/11/25 PHP
PHP浮点数的一个常见问题
2016/03/10 PHP
jquery animate 动画效果使用说明
2009/11/04 Javascript
IE6不能修改NAME问题的解决方法
2010/09/03 Javascript
firefox下frameset取不到值的解决方法
2010/09/06 Javascript
表单验证的完整应用案例探讨
2013/03/29 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
2013/12/30 Javascript
jquery ajax双击div可直接修改div中的内容
2016/03/04 Javascript
jQuery soColorPacker 网页拾色器
2016/06/22 Javascript
PHP抓取HTTPS内容和错误处理的方法
2016/09/30 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
2017/01/19 Javascript
Bootstrap 表单验证formValidation 实现远程验证功能
2017/05/17 Javascript
JS写XSS cookie stealer来窃取密码的步骤详解
2017/11/20 Javascript
JavaScript 有用的代码片段和 trick
2018/02/22 Javascript
微信小程序实现天气预报功能
2018/07/18 Javascript
Node.js中的不安全跳转如何防御详解
2018/10/21 Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
2019/08/01 Javascript
解决echarts vue数据更新,视图不更新问题(echarts嵌在vue弹框中)
2020/07/20 Javascript
vue实现路由懒加载的3种方法示例
2020/09/01 Javascript
JavaScript 绘制饼图的示例
2021/02/19 Javascript
python异常和文件处理机制详解
2016/07/19 Python
python  Django中的apps.py的目的是什么
2018/10/15 Python
Python爬虫beautifulsoup4常用的解析方法总结
2019/02/25 Python
如何基于python3和Vue实现AES数据加密
2020/03/27 Python
Python坐标轴操作及设置代码实例
2020/06/04 Python
html5 postMessage前端跨域并前端监听的方法示例
2018/11/01 HTML / CSS
英国美发和美容产品商城:HQhair
2019/02/08 全球购物
C#如何调用Windows程序打开一个文档
2014/12/26 面试题
办公室主任岗位承诺书
2014/05/29 职场文书
党在我心中演讲稿
2014/09/02 职场文书
2015年人事专员工作总结
2015/04/29 职场文书
检讨书格式
2015/05/07 职场文书
2015年学校心理健康教育工作总结
2015/05/11 职场文书
2019请假条的基本格式及范文!
2019/07/05 职场文书
Golang 编译成DLL文件的操作
2021/05/06 Golang