js操作二進位數據

来源:https://www.cnblogs.com/xianghuali/archive/2018/03/02/8494720.html
-Advertisement-
Play Games

最近做了幾個項目,用js操作二進位數據,通過socket與後臺進行傳輸。在此用博客做個記錄 首先是新建一個socket: 接著定義socket打開,連接之後執行的函數: websocket有個屬性binaryType,可將其設置為“blob”或者“arraybuffer”,預設格式為“blob”,做 ...


最近做了幾個項目,用js操作二進位數據,通過socket與後臺進行傳輸。在此用博客做個記錄

首先是新建一個socket:

1 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

下麵是接收數據處理:

 1 //接收消息onmessage
 2 socket.onmessage=function(data){
 3         var blob_=new Blob([data.data]);
 4         parseBlob(blob_);
 5     }
 6 //使用fileReader操作blob對象
 7 var reader = { 
 8     readAs: function(type,blob,cb){
 9         var r = new FileReader();
10         r.onloadend = function(){
11               if(typeof(cb) === 'function') {
12                 cb.call(r,r.result);
13               }
14         }
15         try{
16               r['readAs'+type](blob);
17         }catch(e){}
18       }
19 }
20 function parseBlob(blob){
21    reader.readAs('ArrayBuffer',blob.slice(0,blob.size),function(arr){
22      var dataview_=new DataView(arr);
23      //協議中第二位是判斷數據來源的
24      var socketConType=dataview_.getUint8(1);
25      //轉成字元串讀取數據
26      var modulelength=(dataview_.buffer.byteLength-46)/33;
27      var modulestate={};
28     reader.readAs('Text',blob.slice(i*33+37,i*33+37+32),function(result){
29         modulestate[dataview_.getUint8(i*33+36)]=result;
30      });
31    })
32 }

轉成字元串之後就可以為所欲為了。

以上就是我做項目時用到的操作二進位數據的方法,按位讀取頭都要炸了······google開源的protobuf能夠設置完數據格式之後,所有讀取操作都不用自己拼接了,非常舒服。不過不懂後臺技術,我只能跟在後臺大佬後面吃饃渣  TnT

第一次寫博客,希望各位能多指導交流


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先,在小程式中,是沒有DOM這個概念的,所以在數據綁定這方面,小程式和Vue是一個思想的,即數據優先。 綁定的方法其實非常之簡單,在Vue中,我們用{{ }}來做數據的單向綁定,等同於v-html,即腳本js指向html。在小程式中同樣如此,用{{ }}表示單向數據綁定,表示從js指向wxml。在 ...
  • 項目地址https://github.com/979451341/AudioVideoStudyCodeTwo/tree/master/FFmpegv%E6%92%AD%E6%94%BE%E8%A7%86%E9%A2%91%E6%9C%89%E5%A3%B0%E9%9F%B3%EF%BC%8C%E6 ...
  • 這個pthread.h文件可以在NDK環境里創建子線程,並對線程能夠做出互斥所、等待、銷毀等控制。寫這個博客的原因是我要寫如何使用FFmpeg播放視頻,因為同時需要播放音頻和視頻所以需要開啟線程,並設置生產者和消費者的關係。好了直接上整體 1.開啟和銷毀線程 pthread_create函數能夠創建 ...
  • iOS應用打包離不開描述文件,也就是mobileprovision文件。 一般我們的操作是雙擊,Xcode就會運行該文件。但是具體文件里是什麼,Xcode又是否真的載入了該文件?文件里又描述了什麼呢?以下步驟都有利於問題的回答。 一:查看描述文件的位置 所有的描述文件安裝後,都保存在Provisio ...
  • 一、javascript簡介 1.1 javascript簡史 javascript誕生於1995年。當時它的主要目的是處理以前由伺服器端語言負責的一些輸入驗證操作。 1.2 javaScript實現 一個完整的JavaScript實現 = 核心(ECMAScript)+文檔對象模型(DOM)+瀏覽 ...
  • 這是效果圖 看起來很簡單是不是 之前一直寫Jquery代碼 總是想著 DOM 操作 思維感覺沒有切換過來 想了很久,最後使用Vue的屬性進行控制,實現了多選計算屬性的功能 直接上源碼! index.html index.js style.css 這樣的功能使用Vue,代碼簡單易懂,相對於原生代碼,無 ...
  • 一、文本樣式 首行縮進 text-indent 首行縮進是將段落的第一行縮進,這是常用的文本格式化效果。一般地,中文寫作時開頭空兩格。[註意]該屬性可以為負值;應用於: 塊級元素(包括block和inline-block) 字間隔 word-spacing 字間隔是指單詞間距,用來設置文字或單詞之間 ...
  • 什麼是Jquery? Jquey就是一款 跨主流瀏覽器的JavaScript庫,簡化JavaScript對HTML操作 就是封裝了JavaScript,能夠簡化我們寫代碼的一個JavaScript庫 為什麼要使用Jquery? 我覺得非常重要的理由就是: 它能夠相容市面上主流的瀏覽器, 我們學習AJ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...