问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

JS 怎么读取二进制文件

发布网友 发布时间:2022-04-21 20:11

我来回答

2个回答

懂视网 时间:2022-04-20 04:16

这次给大家带来js怎样直接操作二进制数据,js直接操作二进制数据的注意事项有哪些,下面就是实战案例,一起来看一下。

首先是新建一个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;
   });
 })
}

转成字符串之后就可以为所欲为了。

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

web端的应用实现后退强制刷新

ionic2中怎么使用自动生成器

热心网友 时间:2022-04-20 01:24

使用FileReader对象,web应用程序可以异步的读取存储在用户计算机上的文件(或者原始数据缓冲)内容,可以使用File对象或者Blob对象来指定所要处理的文件或数据.

readAsBinaryString()
读取指定的Blob对象或File对象中的内容. 当读取操作完成时,readyState属性的值会成为DONE,如果设置了onloadend事件处理程序,则调用之.同时,result属性中将包含所读取文件的原始二进制数据.
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
手机导航地图语音怎么下载 如何分别真金和仿金首饰 怎样区分真金和仿金首饰呢 小学生新年晚会主持人的串词!!(不要太多)急 大大后天就需要了!!!_百度... 周年晚会策划公司 奥格瑞玛传送门大厅在哪 奥格瑞玛传送门大厅怎么走 锻炼颈椎的几个动作 水多久能结冰 冰能在多长时间内形成 请问水低于0度会结冰吗? 如何防止脱发严重 蒜苗炒什么好吃 蒜苗怎么做好吃? 蒜苗炒什么大全 蒜苗多长时间能炒熟 蒜苗炒啥吃好啊 蒜苗炒白菜怎么做好吃窍门 炒蒜苗应该放什么调料? 蒜苗可以和什么一起炒 蒜苗素炒怎么样炒好吃 蒜苗炒肉的做法 怎样炒蒜苗好吃 炒蒜苗怎么炒 蒜苗炒肉的配料? 蒜苗可以炒什么菜 济南的冬天 找到句子分析其修辞并说明表达的效果 胶粘剂拉伸剪切强度 济南知名的激光雕刻机厂家有哪些? 立体建筑剪纸怎么剪跪求教程 济南哪里有卖激光雕刻机的? 在哪学习汽车真皮座椅裁剪 华为HONOR30Lite手机壳怎么选择型号? 帮我弄成“火星文”~~ js reader 读取二进制 华为荣耀10手机壳V10可以用吗 javascript可以主动读取本地文件吗 华为荣耀20的手机壳华为荣耀20青春版可以用吗? js怎样直接操作二进制数据 cocos2d-js怎么获取文件二进制数据 华为荣耀V30和华为哪一款手机壳通用? 怎么用JS读写本地文本文件 华为荣耀30青春版可以用华为荣耀30的手机壳吗? JavaScript从服务器获取二进制数据,responseType=... 华为荣耀7a高配版和低配版的手机壳可以匹配吗? 如何使用JavaScript和XMLHttpRequest的我加载的二... 华为荣耀v10和10手机壳可以通用嘛 JS可以解析二进制流数据吗 华为荣耀30青春版可以用华为荣耀30的手机壳吗? JS如何读取二进制文件 华为荣耀30青春版手机壳原装壳是多厚的? 华为荣耀8手机壳哪些好