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 自定义函数缺省值的设置方法
May 05 Javascript
jQuery的Ajax时无响应数据的解决方法
May 25 Javascript
js实现表格字段排序
Feb 19 Javascript
js获取url中的参数且参数为中文时通过js解码
Mar 19 Javascript
浅谈javascript事件取消和阻止冒泡
May 26 Javascript
js省市区级联查询(插件版&amp;无插件版)
Mar 21 Javascript
使用重写url机制实现验证码换一张功能
Aug 01 Javascript
使用jquery-easyui的布局layout写后台管理页面的代码详解
Jun 19 jQuery
vuex 动态注册方法 registerModule的实现
Jul 03 Javascript
layui表格 返回的数据状态异常的解决方法
Sep 10 Javascript
javascript 数组精简技巧小结
Feb 26 Javascript
基于Element封装一个表格组件tableList的使用方法
Jun 29 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
PHP5中新增stdClass 内部保留类
2011/06/13 PHP
Laravel框架路由配置总结、设置技巧大全
2014/09/03 PHP
解决ThinkPHP下使用上传插件Uploadify浏览器firefox报302错误的方法
2015/12/18 PHP
PHP编写登录验证码功能 附调用方法
2016/05/19 PHP
基于laravel belongsTo使用详解
2019/10/18 PHP
laravel Task Scheduling(任务调度)在windows下的使用详解
2019/10/22 PHP
[推荐]javascript 面向对象技术基础教程
2009/03/03 Javascript
jQuery实现随意改变div任意属性的名称和值(部分原生js实现)
2013/05/28 Javascript
div模拟选择框示例代码
2013/11/03 Javascript
javascript为下拉列表动态添加数据项
2014/05/23 Javascript
javascript实现浏览器窗口传递参数的方法
2014/09/03 Javascript
移动设备手势事件库Touch.js使用详解
2017/08/18 Javascript
结合mint-ui移动端下拉加载实践方法总结
2017/11/08 Javascript
轻量级JS Cookie插件js-cookie的使用方法
2018/03/22 Javascript
jQuery使用bind动态绑定事件无效的处理方法
2018/12/11 jQuery
Echart折线图手柄触发事件示例详解
2018/12/16 Javascript
浅谈vuex中store的命名空间
2019/11/08 Javascript
Vue的Eslint配置文件eslintrc.js说明与规则介绍
2020/02/03 Javascript
微信小程序自定义底部弹出框功能
2020/11/18 Javascript
[02:43]DOTA2英雄基础教程 半人马战行者
2014/01/13 DOTA
python提取具有某种特定字符串的行数据方法
2018/12/11 Python
Python数据分析:手把手教你用Pandas生成可视化图表的教程
2018/12/15 Python
Python爬虫实现获取动态gif格式搞笑图片的方法示例
2018/12/24 Python
从pandas一个单元格的字符串中提取字符串方式
2019/12/17 Python
Python内置数据类型list各方法的性能测试过程解析
2020/01/07 Python
Python装饰器如何实现修复过程解析
2020/09/05 Python
HTML5中的拖放实现详解
2017/08/23 HTML / CSS
Jo Malone美国官网:祖玛珑香水
2017/03/27 全球购物
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
char型变量中能不能存贮一个中文汉字
2015/07/08 面试题
即兴演讲稿
2014/01/04 职场文书
继承权公证书
2014/04/09 职场文书
小学竞选班干部演讲稿
2014/08/20 职场文书
民主生活会对照检查材料思想汇报
2014/09/27 职场文书
nginx简单配置多个server的方法
2021/03/31 Servers
Nebula Graph解决风控业务实践
2022/03/31 MySQL