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 相关文章推荐
一个简单的JS鼠标悬停特效具体方法
Jun 17 Javascript
JS获取地址栏参数的几种方法小结
Feb 28 Javascript
兼容主流浏览器的JS复制内容到剪贴板
Dec 12 Javascript
HTML5之WebSocket入门3 -通信模型socket.io
Aug 21 Javascript
javascript拖拽应用实例
Mar 25 Javascript
bootstrap Validator 模态框、jsp、表单验证 Ajax提交功能
Feb 17 Javascript
强大的 Angular 表单验证功能详细介绍
May 23 Javascript
利用JavaScript实现栈的数据结构示例代码
Aug 02 Javascript
详解vue中点击空白处隐藏div的实现(用指令实现)
Apr 19 Javascript
如何给element添加一个抽屉组件的方法步骤
Jul 14 Javascript
用Node写一条配置环境的指令
Nov 14 Javascript
Vue看了就会的8个小技巧
Jan 21 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
一个可查询所有表的“通用”查询分页类
2006/10/09 PHP
用PHP写的MySQL数据库用户认证系统代码
2007/03/22 PHP
浅谈EasyUI中编辑treegrid的方法
2015/03/01 Javascript
深入浅析JavaScript面向对象和原型函数
2016/02/06 Javascript
JavaScript绑定事件监听函数的通用方法
2016/05/14 Javascript
seajs学习之模块的依赖加载及模块API的导出
2016/10/20 Javascript
jquery.multiselect多选下拉框实现代码
2016/11/11 Javascript
JavaScript简单验证表单空值及邮箱格式的方法
2017/01/20 Javascript
Vue2学习笔记之请求数据交互vue-resource
2017/02/23 Javascript
jQuery动画_动力节点节点Java学院整理
2017/07/04 jQuery
react-router4 嵌套路由的使用方法
2017/07/24 Javascript
js判断节假日实例代码
2017/12/27 Javascript
JS动画定时器知识总结
2018/03/23 Javascript
js+SVG实现动态时钟效果
2018/07/14 Javascript
详解Vue路由自动注入实践
2019/04/17 Javascript
把大数据数字口语化(python与js)两种实现
2013/02/21 Python
Python异常学习笔记
2015/02/03 Python
使用 Python 实现微信群友统计器的思路详解
2018/09/26 Python
详解爬虫被封的问题
2019/04/23 Python
python多线程同步之文件读写控制
2021/02/25 Python
Python模块 _winreg操作注册表
2020/02/05 Python
Python pip install如何修改默认下载路径
2020/04/29 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
2020/08/05 Python
浅析Python的命名空间与作用域
2020/11/25 Python
Python的Tqdm模块实现进度条配置
2021/02/24 Python
linux面试相关问题
2012/08/11 面试题
新锐科技Java程序员面试题
2016/07/25 面试题
大学四年职业生涯规划书范文
2014/01/02 职场文书
捐书倡议书
2014/08/29 职场文书
详细的本科生职业生涯规划范文
2014/09/16 职场文书
老干部工作汇报材料
2014/10/28 职场文书
小学大队长竞选稿
2015/11/20 职场文书
毕业欢送晚会主持词
2019/06/25 职场文书
实习报告范文
2019/07/30 职场文书
Python绘制散乱的点构成的图的方法
2022/04/21 Python
win10如何开启ahci模式?win10开启ahci模式详细操作教程
2022/07/23 数码科技