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 相关文章推荐
模仿jQuery each函数的链式调用
Jul 22 Javascript
一些常用的JavaScript函数(json)附详细说明
May 25 Javascript
jquery增加和删除元素的方法
Jan 14 Javascript
javascript计时器详解
Feb 28 Javascript
JavaScript检查弹出窗口是否被阻拦的方法技巧
Mar 13 Javascript
jquery点击改变class并toggle的实现代码
May 15 Javascript
jQuery+ajax的资源回收处理机制分析
Jan 07 Javascript
d3.js中冷门却实用的内置函数总结
Feb 04 Javascript
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
Nov 19 Javascript
vue cli构建的项目中请求代理与项目打包问题
Feb 26 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
Oct 16 Javascript
Ant Design Pro 之 ProTable使用操作
Oct 31 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
PHP 使用pcntl和libevent 实现Timer功能
2013/10/27 PHP
ThinkPHP在新浪SAE平台的部署实例
2014/10/31 PHP
php从数组中随机选择若干不重复元素的方法
2015/03/14 PHP
Yii中表单用法实例详解
2016/01/05 PHP
PHP自动识别当前使用移动终端
2018/05/21 PHP
jquery 可排列的表实现代码
2009/11/13 Javascript
JavaScript OOP类与继承
2009/11/15 Javascript
JavaScript 对象的属性和方法4种不同的类型
2010/03/19 Javascript
JQuery 应用 JQuery.groupTable.js
2010/12/15 Javascript
js获取和设置属性的方法
2014/02/20 Javascript
用javascript对一个json数组深度赋值示例
2014/07/27 Javascript
移动端js图片查看器
2016/11/17 Javascript
Ajax和Comet技术总结
2017/02/19 Javascript
微信小程序数字滚动插件使用详解
2018/02/02 Javascript
js canvas实现写字动画效果
2018/11/30 Javascript
JavaScript解析机制与闭包原理实例详解
2019/03/08 Javascript
Vue中axios的封装(报错、鉴权、跳转、拦截、提示)
2019/08/20 Javascript
Postman无法正常返回结果问题解决
2020/08/28 Javascript
[03:21]辉夜杯主赛事 12月25日TOP5
2015/12/26 DOTA
python实现逆序输出一个数字的示例讲解
2018/06/25 Python
如何使用Python 打印各种三角形
2019/06/28 Python
python创建学生成绩管理系统
2019/11/22 Python
基于python实现MQTT发布订阅过程原理解析
2020/07/27 Python
Python之字符串的遍历的4种方式
2020/12/08 Python
美国睫毛、眉毛精华液领导品牌:RevitaLash Cosmetics
2018/03/26 全球购物
Halston Heritage官网:简洁的日装,稍显奢华的晚装
2018/11/20 全球购物
吉列剃须刀英国官网:Gillette英国
2019/03/28 全球购物
领先的英国注册在线药房 :Simply Meds Online
2019/03/28 全球购物
KENZO官网:高田贤三在法国创立的品牌
2019/05/16 全球购物
abstract class和interface有什么区别?
2012/01/03 面试题
行政前台岗位职责
2013/12/04 职场文书
俄语专业职业生涯规划
2014/02/26 职场文书
2014年助理工程师工作总结
2014/11/14 职场文书
工程技术员岗位职责
2015/04/11 职场文书
css height属性中的calc方法详解
2021/06/03 HTML / CSS
CPU不支持Windows11系统怎么办
2021/11/21 数码科技