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 相关文章推荐
jQuery的三种$()
Dec 30 Javascript
javascript的日期对象、数组对象、二维数组使用说明
Dec 22 Javascript
浅谈javascript属性onresize
Apr 20 Javascript
JavaScript 深层克隆对象详解及实例
Nov 03 Javascript
jQuery 如何实现一个滑动按钮开关
Dec 01 Javascript
jQuery+ajax的资源回收处理机制分析
Jan 07 Javascript
解决option标签selected=&quot;selected&quot;属性失效的问题
Nov 06 Javascript
深入剖析Node.js cluster模块
May 23 Javascript
bootstrap动态调用select下拉框的实例代码
Aug 09 Javascript
Vue中使用 setTimeout() setInterval()函数的问题
Sep 13 Javascript
详解基于React.js和Node.js的SSR实现方案
Mar 21 Javascript
vue 动态添加的路由页面刷新时失效的原因及解决方案
Feb 26 Vue.js
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中使用cURL实现Get和Post请求的方法
2013/03/13 PHP
jQuery Mobile + PHP实现文件上传
2014/12/12 PHP
购物车实现的几种方式优缺点对比
2018/05/02 PHP
PDO::commit讲解
2019/01/27 PHP
javascript入门·图片对象(无刷新变换图片)\滚动图像
2007/10/01 Javascript
JS中的form.submit()不能提交表单的错误原因
2014/10/08 Javascript
JS组件Bootstrap Table表格行拖拽效果实现代码
2020/08/27 Javascript
JavaScript中rem布局在react中的应用
2015/12/09 Javascript
创建一个类Person的简单实例
2016/05/17 Javascript
Sortable.js拖拽排序使用方法解析
2016/11/04 Javascript
原生JS实现幻灯片
2017/02/22 Javascript
详解wow.js中各种特效对应的类名
2017/09/13 Javascript
Vue DevTools调试工具的使用
2017/12/05 Javascript
JS实现图片转换成base64的各种应用场景实例分析
2018/06/22 Javascript
微信小程序Getuserinfo解决方案图解
2018/08/24 Javascript
微信小程序引入Vant组件库过程解析
2019/08/06 Javascript
JS实现字体背景跑马灯
2020/01/06 Javascript
vue 中this.$set 动态绑定数据的案例讲解
2021/01/29 Vue.js
举例讲解Django中数据模型访问外键值的方法
2015/07/21 Python
Python的math模块中的常用数学函数整理
2016/02/04 Python
Python设计模式之抽象工厂模式
2016/08/25 Python
python3.4下django集成使用xadmin后台的方法
2017/08/15 Python
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
python中模块的__all__属性详解
2017/10/26 Python
Python中xrange与yield的用法实例分析
2017/12/26 Python
flask-socketio实现WebSocket的方法
2018/07/31 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
2018/08/07 Python
python正则表达式匹配[]中间为任意字符的实例
2018/12/25 Python
Python Matplotlib绘图基础知识代码解析
2020/08/31 Python
吉力贝官方网站:Jelly Belly
2019/03/11 全球购物
保加利亚运动鞋购物网站:SneakerStudio.bg
2020/12/23 全球购物
初中生个人学习的自我评价
2013/12/04 职场文书
管理心得体会
2013/12/28 职场文书
大学毕业感言200字
2014/03/09 职场文书
2015年安全生产工作总结范文
2015/04/02 职场文书
redis复制有可能碰到的问题汇总
2022/04/03 Redis