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 相关文章推荐
打开超链需要“确认”对话框的方法
Mar 08 Javascript
兼容多浏览器的字幕特效Marquee的通用js类
Jul 20 Javascript
Ajax+Json 级联菜单实现代码
Oct 27 Javascript
基于编写jQuery的无缝滚动插件
Aug 02 Javascript
jquery Deferred 快速解决异步回调的问题
Apr 05 Javascript
JavaScript实现打印星型金字塔功能实例分析
Sep 27 Javascript
JS基于封装函数实现的表格分页完整示例
Jun 26 Javascript
angularjs 的数据绑定实现原理
Jul 02 Javascript
Element 默认勾选表格 toggleRowSelection的实现
Sep 04 Javascript
echarts实现折线图的拖拽效果
Dec 19 Javascript
vue-cli3配置favicon.ico和title的流程
Oct 27 Javascript
Vue详细的入门笔记
May 10 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 数据库树的遍历方法
2009/02/06 PHP
php实现利用phpexcel导出数据
2013/08/24 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
使用php实现网站验证码功能【推荐】
2017/02/09 PHP
PHP获取数组中单列值的方法
2017/06/10 PHP
php使用 readfile() 函数设置文件大小大小的方法
2017/08/11 PHP
javascript+dom树型菜单类,希望朋友们一起进步
2007/05/03 Javascript
学习jquery必备 api中英文对照的chm手册 下载
2007/05/03 Javascript
js 匿名调用实现代码
2009/06/19 Javascript
Javascript笔记一 js以及json基础使用说明
2010/05/22 Javascript
jcarousellite.js 基于Jquery的图片无缝滚动插件
2010/12/30 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
2012/05/20 Javascript
JS下载文件|无刷新下载文件示例代码
2014/04/17 Javascript
JavaScript仿淘宝页面图片滚动加载及刷新回顶部的方法解析
2016/05/24 Javascript
seajs学习之模块的依赖加载及模块API的导出
2016/10/20 Javascript
JavaScript学习总结之正则的元字符和一些简单的应用
2017/06/30 Javascript
VUE中v-on:click事件中获取当前dom元素的代码
2018/08/22 Javascript
Vue实现动态添加或者删除对象和对象数组的操作方法
2018/09/21 Javascript
详解nodejs 配置文件处理方案
2019/01/02 NodeJs
vue cli 3.x 项目部署到 github pages的方法
2019/04/17 Javascript
vue scroll滚动判断的实现(是否滚动到底部、滚动方向、滚动节流、获取滚动区域dom元素)
2020/06/11 Javascript
解决antd Form 表单校验方法无响应的问题
2020/10/27 Javascript
[03:49]显微镜下的DOTA2第十五期—VG登基之路完美团
2014/06/24 DOTA
python中的计时器timeit的使用方法
2017/10/20 Python
Python从Excel中读取日期一列的方法
2018/11/28 Python
在Python 中实现图片加框和加字的方法
2019/01/26 Python
python实现爬山算法的思路详解
2019/04/09 Python
在python中利用try..except来代替if..else的用法
2019/12/19 Python
python使用numpy实现直方图反向投影示例
2020/01/17 Python
Python3读写Excel文件(使用xlrd,xlsxwriter,openpyxl3种方式读写实例与优劣)
2020/02/13 Python
解决pytorch-yolov3 train 报错的问题
2020/02/18 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
2020/09/09 Python
作文批改评语大全
2014/04/23 职场文书
领导班子四风对照检查材料范文
2014/09/27 职场文书
新郎接新娘保证书
2015/05/08 职场文书
浅谈MySql update会锁定哪些范围的数据
2022/06/25 MySQL