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 相关文章推荐
Javascript - HTML的request类
Jul 15 Javascript
JQery 渐变图片导航效果代码 漂亮
Jan 01 Javascript
用Mootools获得操作索引的两种方法分享
Dec 12 Javascript
javascript调试过程中找不到哪里出错的可能原因
Dec 16 Javascript
纯javascript制作日历控件
Jul 17 Javascript
jQuery实现点击后标记当前菜单位置(背景高亮菜单)效果
Aug 22 Javascript
js实现文字向上轮播功能
Jan 13 Javascript
Angular.JS通过指令操作DOM的方法
May 10 Javascript
使用JS实现气泡跟随鼠标移动的动画效果
Sep 16 Javascript
jQuery实现点击DIV同时点击CheckBox,并为DIV上背景色的实例
Dec 18 jQuery
layui使用templet格式化表格数据的方法
Sep 16 Javascript
微信小程序修改checkbox的样式代码实例
Jan 21 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
php中错误处理操作实例分析
2019/08/23 PHP
JavaScript写的一个自定义弹出式对话框代码
2010/01/17 Javascript
使用jQuery实现dropdownlist的联动效果(sharepoint 2007)
2011/03/30 Javascript
JQEasy-ui在IE9以下版本中二次加载的问题分析及处理方法
2014/06/23 Javascript
jquery实现在光标位置插入内容的方法
2015/02/05 Javascript
JavaScript模拟可展开、拖动与关闭的聊天窗口实例
2015/05/12 Javascript
深入分析jQuery的ready函数是如何工作的(工作原理)
2015/12/17 Javascript
JavaScript获取中英文混合字符串长度的方法示例
2017/02/04 Javascript
JS实现数组去重复值的方法示例
2017/02/18 Javascript
javascript 中的try catch应用总结
2017/04/01 Javascript
微信小程序 登录的简单实现
2017/04/19 Javascript
微信小程序如何获知用户运行小程序的场景教程
2017/05/17 Javascript
vuejs+element-ui+laravel5.4上传文件的示例代码
2017/08/12 Javascript
jQuery实现点击DIV同时点击CheckBox,并为DIV上背景色的实例
2017/12/18 jQuery
js构造函数创建对象是否加new问题
2018/01/22 Javascript
koa2实现登录注册功能的示例代码
2018/12/03 Javascript
JavaScript大数相加相乘的实现方法实例
2020/10/18 Javascript
pyqt4教程之实现半透明的天气预报界面示例
2014/03/02 Python
Python的设计模式编程入门指南
2015/04/02 Python
Python用csv写入文件_消除空余行的方法
2018/07/06 Python
pandas 快速处理 date_time 日期格式方法
2018/11/12 Python
django ModelForm修改显示缩略图 imagefield类型的实例
2019/07/28 Python
Python itertools.product方法代码实例
2020/03/27 Python
基于tf.shape(tensor)和tensor.shape()的区别说明
2020/06/30 Python
python将下载到本地m3u8视频合成MP4的代码详解
2020/11/24 Python
用canvas画心电图的示例代码
2018/09/10 HTML / CSS
美国知名艺术画网站:Art.com
2017/02/09 全球购物
房地产员工找工作的自我评价
2013/11/15 职场文书
运动会广播稿50字
2014/01/26 职场文书
安全生产目标责任书
2014/04/14 职场文书
第二批党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
首次购房证明
2015/06/19 职场文书
Python 如何安装Selenium
2021/05/06 Python
python flask框架快速入门
2021/05/14 Python
opencv检测动态物体的实现
2021/07/21 Python
python编程项目中线上问题排查与解决
2021/11/01 Python