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跑步算法的实现代码
Dec 04 Javascript
node-http-proxy修改响应结果实例代码
Jun 06 Javascript
jQuery实现级联下拉框实战(5)
Feb 08 Javascript
JavaScript组件开发之输入框加候选框
Mar 10 Javascript
浅析JavaScript中的平稳退化(graceful degradation)
Jul 24 Javascript
Angular5中状态管理的实现
Sep 03 Javascript
利用hasOwnProperty给数组去重的面试题分享
Nov 05 Javascript
js的对象与函数详解
Jan 21 Javascript
Koa 中的错误处理解析
Apr 09 Javascript
vue cli使用融云实现聊天功能的实例代码
Apr 19 Javascript
微信小程序获取用户绑定手机号方法示例
Jul 21 Javascript
JavaScript判断数据类型有几种方法及区别介绍
Sep 02 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
星际初学者游戏中永远要做的事
2020/03/04 星际争霸
php获取当月最后一天函数分享
2015/02/02 PHP
解决laravel查询构造器中的别名问题
2019/10/17 PHP
新浪的图片新闻效果
2007/01/13 Javascript
用jQuery实现检测浏览器及版本的脚本代码
2008/01/22 Javascript
js left,right,mid函数
2008/06/10 Javascript
ymPrompt的doHandler方法来实现获取子窗口返回值的方法
2010/06/25 Javascript
jquery索引在使用中的一些困惑
2013/10/24 Javascript
node.js中的fs.futimesSync方法使用说明
2014/12/17 Javascript
javascript消除window.close()的提示窗口
2015/05/20 Javascript
浅谈javascript中基本包装类型
2015/06/03 Javascript
Javascript中String的常用方法实例分析
2015/06/13 Javascript
jQuery验证插件validate使用方法详解
2020/09/13 Javascript
JS实现鼠标滑过显示边框的菜单效果
2016/09/21 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
2016/11/30 Javascript
vue调用高德地图实例代码
2017/04/28 Javascript
JS基于贪心算法解决背包问题示例
2017/11/27 Javascript
jQuery实现右侧抽屉式在线客服功能
2017/12/25 jQuery
Vue render深入开发讲解
2018/04/13 Javascript
基于vue,vue-router, vuex及addRoutes进行权限控制问题
2018/05/02 Javascript
vue 中基于html5 drag drap的拖放效果案例分析
2018/11/01 Javascript
js事件触发操作实例分析
2019/06/21 Javascript
开发中常用的25个JavaScript单行代码(小结)
2019/06/28 Javascript
JS实现灯泡开关特效
2020/03/30 Javascript
阿望教你用vue写扫雷小游戏
2020/01/20 Javascript
Python多线程结合队列下载百度音乐的方法
2015/07/27 Python
Python中操作mysql的pymysql模块详解
2016/09/13 Python
Django框架模板文件使用及模板文件加载顺序分析
2019/05/23 Python
Python 解决OPEN读文件报错 ,路径以及r的问题
2019/12/19 Python
出门问问全球官方商城:Tichome音箱和TicWatch智能手表
2017/12/02 全球购物
介绍一下Linux文件的记录形式
2013/09/29 面试题
交通事故和解协议书
2015/01/27 职场文书
爱国主义教育主题班会
2015/08/13 职场文书
幼儿教师三分钟演讲稿
2019/06/21 职场文书
redis缓存存储Session原理机制
2021/11/20 Redis
PostgreSQL出现死锁该如何解决
2022/05/30 PostgreSQL