js操作二進(jìn)制數(shù)據(jù)方法
最近做了幾個(gè)項(xiàng)目,用js操作二進(jìn)制數(shù)據(jù),通過(guò)socket與后臺(tái)進(jìn)行傳輸。在此用博客做個(gè)記錄
首先是新建一個(gè)socket:
var socket=new WebSocket("ws://192.168.0.147");
接著定義socket打開,連接之后執(zhí)行的函數(shù):
websocket有個(gè)屬性binaryType,可將其設(shè)置為“blob”或者“arraybuffer”,默認(rèn)格式為“blob”,做項(xiàng)目的時(shí)候忘記設(shè)置為“arraybuffer”了,結(jié)果在下面接收數(shù)據(jù)的時(shí)候就需要用Blob對(duì)象來(lái)接。
socket.onopen=function(){
//發(fā)送登錄幀,4-20位為手機(jī)號(hào)
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]
}
下面是轉(zhuǎn)成bype發(fā)送出去:
var loginBuffer=new ArrayBuffer(30);
var loginDataview=new DataView(loginBuffer);
//localstorageuserinfo為緩存在本地的用戶手機(jī)號(hào)
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);
//格式化時(shí)間同時(shí)按照年倆位月日時(shí)分秒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;
}
發(fā)送的流程大概就是這樣,先new ArrayBuffer對(duì)象,該對(duì)象需要填入緩沖區(qū)長(zhǎng)度參數(shù),具體查看api==> https://msdn.microsoft.com/zh-cn/library/br212474(v=vs.94).aspx,
然后新建DataView對(duì)象,將ArrayBuffer傳進(jìn)去。然后用DataView的setUint和getUint方法按位進(jìn)行讀取設(shè)置,具體參考api==> https://msdn.microsoft.com/zh-cn/library/br212463(v=vs.94).aspx
下面是接收數(shù)據(jù)處理:
//接收消息onmessage
socket.onmessage=function(data){
var blob_=new Blob([data.data]);
parseBlob(blob_);
}
//使用fileReader操作blob對(duì)象
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);
//協(xié)議中第二位是判斷數(shù)據(jù)來(lái)源的
var socketConType=dataview_.getUint8(1);
//轉(zhuǎn)成字符串讀取數(shù)據(jù)
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;
});
})
}
轉(zhuǎn)成字符串之后就可以為所欲為了。
以上就是我做項(xiàng)目時(shí)用到的操作二進(jìn)制數(shù)據(jù)的方法,按位讀取頭都要炸了······google開源的protobuf能夠設(shè)置完數(shù)據(jù)格式之后,所有讀取操作都不用自己拼接了,非常舒服。不過(guò)不懂后臺(tái)技術(shù),我只能跟在后臺(tái)大佬后面吃饃渣 TnT
這篇js操作二進(jìn)制數(shù)據(jù)方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 基于javascript處理二進(jìn)制圖片流過(guò)程詳解
- node.JS二進(jìn)制操作模塊buffer對(duì)象使用方法詳解
- nodejs二進(jìn)制與Buffer的介紹與使用
- JS字符串與二進(jìn)制的相互轉(zhuǎn)化實(shí)例代碼詳解
- Node.js Windows Binary二進(jìn)制文件安裝方法
- JavaScript讀寫二進(jìn)制數(shù)據(jù)的方法詳解
- 詳解nodeJS之二進(jìn)制buffer對(duì)象
- js 顯示base64編碼的二進(jìn)制流網(wǎng)頁(yè)圖片
- javascript 二進(jìn)制運(yùn)算技巧解析
- 淺談JS的二進(jìn)制家族
相關(guān)文章
uni-app如何用JS動(dòng)態(tài)修改scss樣式變量
對(duì)于uni-app中的組件,可以通過(guò)修改它們的樣式來(lái)自定義它們的外觀,下面這篇文章主要給大家介紹了關(guān)于uni-app如何用JS動(dòng)態(tài)修改scss樣式變量的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07
JS關(guān)于?replace?取值、替換第幾個(gè)匹配項(xiàng)問(wèn)題小結(jié)
這篇文章主要介紹了JS關(guān)于replace取值、替換第幾個(gè)匹配項(xiàng),本文針對(duì)字符串的替換、截取知識(shí)點(diǎn)做詳細(xì)介紹,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05
javascript 支持鏈?zhǔn)秸{(diào)用的異步調(diào)用框架Async.Operation
javascript 支持鏈?zhǔn)秸{(diào)用的異步調(diào)用框架Async.Operation2009-08-08
JS中showModalDialog關(guān)閉子窗口刷新主窗口用法詳解
這篇文章主要介紹了JS中showModalDialog關(guān)閉子窗口刷新主窗口用法,結(jié)合具體實(shí)例形式較為詳細(xì)的分析了showModalDialog常見用法與相關(guān)使用技巧,需要的朋友可以參考下2017-03-03
如何利用原生JS實(shí)時(shí)監(jiān)聽input框輸入值
這篇文章主要介紹了如何利用原生JS實(shí)時(shí)監(jiān)聽input框輸入值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
location.search在客戶端獲取Url參數(shù)的方法
最近一直在寫html,剛接觸到,感覺(jué)挺復(fù)雜的。。比如傳參,在.net里可以直接用Request接受,而在html中還要經(jīng)過(guò)處理,找了一些資料,寫了個(gè)方法。2010-06-06

