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 While 循环基础教程
Apr 05 Javascript
JavaScript 入门·JavaScript 具有全范围的运算符
Oct 01 Javascript
jquery的extend和fn.extend的使用说明
Jan 09 Javascript
用正则表达式替换图片地址img标签
Nov 22 Javascript
分享一款基于jQuery的视频播放插件
Oct 09 Javascript
Lua表达式和控制结构学习笔记
Dec 15 Javascript
JavaScript Split()方法
Dec 18 Javascript
vue组件之Alert的实现代码
Oct 17 Javascript
vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】
Aug 29 Javascript
vue input输入框关键字筛选检索列表数据展示
Oct 26 Javascript
JS 封装父页面子页面交互接口的实例代码
Jun 25 Javascript
微信小程序 bindtap 传参的实例代码
Feb 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
基于mysql的bbs设计(一)
2006/10/09 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
2015/09/20 PHP
浅谈PHP匿名函数和闭包
2019/03/08 PHP
Yii Framework框架开发微信公众平台示例
2020/04/26 PHP
简略的前端架构心得&amp;&amp;基于editor为例子的编码小技巧
2010/11/25 Javascript
从零开始学习jQuery (十) jQueryUI常用功能实战
2011/02/23 Javascript
关于function类中定义变量this的简单说明
2016/05/28 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
2016/06/13 Javascript
AngularJS  ng-table插件设置排序
2016/09/21 Javascript
JavaScript实现弹窗效果代码分析
2017/03/09 Javascript
js中编码函数:escape,encodeURI与encodeURIComponent详解
2017/03/21 Javascript
Vue input控件通过value绑定动态属性及修饰符的方法
2017/05/03 Javascript
学习使用Bootstrap栅格系统
2017/05/11 Javascript
js is_valid_filename验证文件名的函数
2017/07/19 Javascript
Angular通过指令动态添加组件问题
2018/07/09 Javascript
vue实现在线预览pdf文件和下载(pdf.js)
2019/11/26 Javascript
vue中使用腾讯云Im的示例
2020/10/23 Javascript
解决iview table组件里的 固定列 表格不自适应的问题
2020/11/13 Javascript
JavaScript中遍历的十种方法总结
2020/12/15 Javascript
vue 页面跳转的实现方式
2021/01/12 Vue.js
linux系统使用python监测网络接口获取网络的输入输出
2014/01/15 Python
TensorFlow——Checkpoint为模型添加检查点的实例
2020/01/21 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
django跳转页面传参的实现
2020/09/17 Python
英国豪华文具和皮具配件经典老品牌:Smythson(斯迈森)
2018/04/19 全球购物
Fresh馥蕾诗英国官网:法国LVMH集团旗下高端天然护肤品牌
2018/11/01 全球购物
澳大利亚波希米亚风时尚品牌:Tree of Life
2019/09/15 全球购物
研究生自我鉴定范文
2013/10/30 职场文书
学生就业推荐信
2013/11/13 职场文书
顶岗实习接收函
2014/01/09 职场文书
巧克力蛋糕店创业计划书
2014/01/14 职场文书
房屋买卖协议书范本
2014/09/27 职场文书
优秀教师申报材料
2014/12/16 职场文书
慈善献爱心倡议书
2015/04/27 职场文书
2015年高一班主任工作总结
2015/05/13 职场文书
vue3中的组件间通信
2021/03/31 Vue.js