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 相关文章推荐
prototype.js的Ajax对象
Sep 23 Javascript
Extjs学习笔记之一 初识Extjs之MessageBox
Jan 07 Javascript
jQuery制作的别致导航有阴影背景高亮模式窗口
Apr 15 Javascript
jQuery 顶部导航跟随滚动条滚动固定浮动在顶部
Jun 06 Javascript
javascript设计模式之对象工厂函数与构造函数详解
Jul 30 Javascript
javascript断点调试心得分享
Apr 23 Javascript
原生和jQuery的ajax用法详解
Jan 23 Javascript
滚动条的监听与内容随着滚动条动态加载的实现
Feb 08 Javascript
原生js实现简单的Ripple按钮实例代码
Mar 24 Javascript
webpack独立打包和缓存处理详解
Apr 03 Javascript
javascript中this用法实例详解
Apr 06 Javascript
jQuery实现列表的增加和删除功能
Jun 14 jQuery
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和ACCESS写聊天室(四)
2006/10/09 PHP
Fine Uploader文件上传组件应用介绍
2013/01/06 PHP
PHP中如何实现常用邮箱的基本判断
2014/01/07 PHP
读jQuery之六 缓存数据功能介绍
2011/06/21 Javascript
拥抱模块化的JavaScript
2012/03/07 Javascript
跟我学Nodejs(三)--- Node.js模块
2014/05/25 NodeJs
IE中图片的onload事件无效问题和解决方法
2014/06/06 Javascript
html文档中的location对象属性理解及常见的用法
2014/08/13 Javascript
js面向对象之静态方法和静态属性实例分析
2015/01/10 Javascript
jquery使用ul模拟select实现表单美化的方法
2015/08/18 Javascript
详解JavaScript 中的 replace 方法
2016/01/01 Javascript
简单谈谈Vue 模板各类数据绑定
2016/09/25 Javascript
JavaScript中绑定事件的三种方式及去除绑定
2016/11/05 Javascript
javascript利用键盘控制小方块的移动
2020/04/20 Javascript
微信小程序用户登录和登录态维护的实现
2020/12/10 Javascript
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
python控制台显示时钟的示例
2014/02/24 Python
Linux 下 Python 实现按任意键退出的实现方法
2016/09/25 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
2018/01/06 Python
Python Pandas数据中对时间的操作
2019/07/30 Python
基于Python中isfile函数和isdir函数使用详解
2019/11/29 Python
你可能不知道的Python 技巧小结
2020/01/29 Python
主持人婚宴答谢词
2014/01/28 职场文书
2014年健康教育实施方案
2014/02/17 职场文书
询价采购方案
2014/06/09 职场文书
汽车运用工程专业求职信
2014/06/18 职场文书
人大调研汇报材料
2014/08/14 职场文书
校园文化艺术节宣传标语
2014/10/09 职场文书
复试通知单模板
2015/04/24 职场文书
2015年度合同管理工作总结
2015/05/22 职场文书
黑白记忆观后感
2015/06/18 职场文书
环保证明
2015/06/23 职场文书
pytorch损失反向传播后梯度为none的问题
2021/05/12 Python
总结Python常用的魔法方法
2021/05/25 Python
关于MybatisPlus配置双数据库驱动连接数据库问题
2022/01/22 Java/Android
为什么MySQL8新特性会修改自增主键属性
2022/04/18 MySQL