亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

WebSocket系列之JavaScript中數(shù)字?jǐn)?shù)據(jù)如何轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)

MASAILA / 3073人閱讀

摘要:以和為例,說(shuō)明中的數(shù)字?jǐn)?shù)據(jù)如何轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)。對(duì)象用來(lái)表示通用的固定長(zhǎng)度的原始二進(jìn)制數(shù)據(jù)緩沖區(qū)。中的數(shù)字?jǐn)?shù)據(jù)如何轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)對(duì)和有了一個(gè)大概的了解,下面讓我們來(lái)看下它是如何進(jìn)行二進(jìn)制數(shù)據(jù)操作的。

概述

本文主要通過(guò)對(duì)JavaScript中數(shù)字?jǐn)?shù)據(jù)與二進(jìn)制數(shù)據(jù)之間的轉(zhuǎn)換,讓讀者能夠了解在JavaScript中如何對(duì)數(shù)字類(lèi)型(包括但不限于Number類(lèi)型)進(jìn)行處理。

二進(jìn)制數(shù)據(jù)在日常的JavaScript中很少遇到,但是當(dāng)你使用WebSocket與后端進(jìn)行數(shù)據(jù)交互時(shí),就有可能會(huì)用到二進(jìn)制的數(shù)據(jù)格式。因此,為了更好的理解本系列中之后發(fā)布的關(guān)于WebSocket傳輸二進(jìn)制相關(guān)的內(nèi)容,我們有必要了解二進(jìn)制數(shù)據(jù)在JavaScript中是如何進(jìn)行操作和存儲(chǔ)的。

本文內(nèi)容主要為:

JavaScript中如何操作與存儲(chǔ)二進(jìn)制數(shù)據(jù)——ArrayBuffer存儲(chǔ)結(jié)構(gòu)相關(guān)基礎(chǔ)知識(shí)以及對(duì)應(yīng)的DataView相關(guān)數(shù)據(jù)類(lèi)型基礎(chǔ)知識(shí)和和API接口,同時(shí)對(duì)字節(jié)序問(wèn)題進(jìn)行介紹。

以Int和Short為例,說(shuō)明JavaScript中的數(shù)字?jǐn)?shù)據(jù)如何轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)。

以L(fǎng)ong類(lèi)型為例,說(shuō)明JavaScript中如何表示Long類(lèi)型并且如何將其轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)。

如何將二進(jìn)制數(shù)據(jù)中轉(zhuǎn)換為JavaScript中的數(shù)字?jǐn)?shù)據(jù)。

本文與WebSocket并無(wú)太強(qiáng)關(guān)聯(lián),不過(guò)作為在WebSocket中傳遞二進(jìn)制數(shù)據(jù)的基礎(chǔ)知識(shí)儲(chǔ)備,因此放入了此系列當(dāng)中。

如果讀者對(duì)WebSocket并不了解,或者說(shuō)不明白它的使用場(chǎng)景和細(xì)節(jié),可以閱讀我的前一篇博客——WebSocket系列之基礎(chǔ)知識(shí)入門(mén)篇。

如果讀者想了解String類(lèi)型與二進(jìn)制之間的處理和轉(zhuǎn)換,可以于都WebSocket系列稍后發(fā)布的文章(文章發(fā)布后會(huì)替換此段)。

如果讀者想了解在WebSocket中如何進(jìn)行二進(jìn)制的傳遞和解析,可以閱讀WebSocket系列稍后發(fā)布的文章(文章發(fā)布后會(huì)替換此段)。

JavaScript中如何存儲(chǔ)和操作二進(jìn)制數(shù)據(jù)

了解了為什么需要使用二進(jìn)制數(shù)據(jù),我們來(lái)看下,在JavaScript中如何存儲(chǔ)和操作二進(jìn)制數(shù)據(jù)。

ArrayBuffer

首先,我們要介紹下在JavaScript中用來(lái)存儲(chǔ)二進(jìn)制數(shù)據(jù)的ArrayBuffer

ArrayBuffer 對(duì)象用來(lái)表示通用的、固定長(zhǎng)度的原始二進(jìn)制數(shù)據(jù)緩沖區(qū)。

在MDN的文檔中,我們能夠看到ArrayBuffer的介紹。它是在JavaScript中用來(lái)進(jìn)行二進(jìn)制數(shù)據(jù)存儲(chǔ)的一種數(shù)據(jù)對(duì)象。

下面我們通過(guò)一個(gè)示例來(lái)簡(jiǎn)單介紹下ArrayBuffer相關(guān)操作。

const buffer = new ArrayBuffer(8);

buffer.byteLength; // 結(jié)果為8

上面的示例通過(guò)創(chuàng)建一個(gè)長(zhǎng)度為8Byte的二進(jìn)制數(shù)據(jù)緩沖區(qū)。緩沖區(qū)只是一個(gè)數(shù)據(jù)存儲(chǔ)的空間,如何對(duì)這個(gè)存儲(chǔ)空間進(jìn)行讀取,完全取決于使用者。例如:8個(gè)字節(jié)可以當(dāng)成是2個(gè)Int類(lèi)型的數(shù)據(jù),也可以是一個(gè)Long類(lèi)型的數(shù)據(jù),或者4個(gè)Short型的數(shù)據(jù)。

DataView

看完了存儲(chǔ)數(shù)據(jù)的ArrayBuffer,我們來(lái)看下數(shù)據(jù)讀寫(xiě)的DataView

DataView 視圖是一個(gè)可以從 ArrayBuffer 對(duì)象中讀寫(xiě)多種數(shù)值類(lèi)型的底層接口,在讀寫(xiě)時(shí)不用考慮平臺(tái)字節(jié)序問(wèn)題。

這個(gè)是在MDN中關(guān)于DataView的介紹。DataView提供了大量的API接口來(lái)進(jìn)行數(shù)據(jù)的讀和寫(xiě)操作,我們?cè)诤笕聦?huì)舉例進(jìn)行說(shuō)明。但是,首先我們得先看下說(shuō)明中提到的字節(jié)序問(wèn)題。

字節(jié)序

在現(xiàn)有的計(jì)算機(jī)體系中,有兩種字節(jié)序:

大端字節(jié)序:高位在前,低位在后。符合人類(lèi)閱讀習(xí)慣。

小端字節(jié)序:低位在前,高位在后。符合計(jì)算機(jī)讀取習(xí)慣。

上面所說(shuō)的順序均是針對(duì)多字節(jié)對(duì)象而言,如Int類(lèi)型,Long類(lèi)型。以Int類(lèi)型數(shù)據(jù)0x1234為例,如果是大端字節(jié)序,那么數(shù)據(jù)從人類(lèi)對(duì)數(shù)值的通常寫(xiě)法上來(lái)看就是0x1234;如果是小端字節(jié)序,那么從人類(lèi)對(duì)數(shù)值的通常寫(xiě)法上來(lái)看,應(yīng)該寫(xiě)成0x3412。

對(duì)于單字節(jié)對(duì)象如Byte類(lèi)型數(shù)據(jù)而言,沒(méi)有字節(jié)序一說(shuō)。

在不同的平臺(tái)中,可能使用不同的字節(jié)序,這就是所謂的字節(jié)序問(wèn)題。DataView所謂的在讀寫(xiě)時(shí)不需要考慮平臺(tái)字節(jié)序問(wèn)題是指:同時(shí)使用DataView進(jìn)行寫(xiě)入和讀取的數(shù)據(jù)保持一致。

JavaScript中的數(shù)字?jǐn)?shù)據(jù)如何轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)

對(duì)ArrayBuffer和DataView有了一個(gè)大概的了解,下面讓我們來(lái)看下它是如何進(jìn)行二進(jìn)制數(shù)據(jù)操作的。

本章,我以Short類(lèi)型和Int類(lèi)型為例,介紹下相關(guān)操作步驟。

let buffer = new ArrayBuffer(6); // 初始化6個(gè)Byte的二進(jìn)制數(shù)據(jù)緩沖區(qū)
let dataView = new DataView(buffer);

dataView.setInt16(0, 3); // 從第0個(gè)Byte位置開(kāi)始,放置一個(gè)數(shù)字為3的Short類(lèi)型數(shù)據(jù)(占2 Byte)
dataView.setInt32(2, 15); // 從第2個(gè)Byte位置開(kāi)始,放置一個(gè)數(shù)字為15的Short類(lèi)型數(shù)據(jù)(占4 Byte)

通過(guò)上面的示例,我們一共初始化了6個(gè)Byte的存儲(chǔ)空間,使用1個(gè)Short類(lèi)型(占2 Byte)和一個(gè)Int類(lèi)型(占4 Byte)的數(shù)據(jù)進(jìn)行填充。

DataView還提供了許多的API接口來(lái)進(jìn)行其他數(shù)據(jù)類(lèi)型的處理,如無(wú)符號(hào)型,浮點(diǎn)數(shù)等。他們的使用方法和上面介紹的API相同,我們?cè)谶@里就不一一進(jìn)行介紹了,希望了解更多API接口的讀者可以查看MDN文檔。

JavaScript中如何表示Long類(lèi)型并且如何將其轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)

通過(guò)DataView提供的API接口,我們知道了如何處理Short類(lèi)型、Int類(lèi)型、Float類(lèi)型和Double類(lèi)型。那么,如果是對(duì)于Long類(lèi)型這種原生API中沒(méi)有提供處理函數(shù)的數(shù)據(jù)類(lèi)型,我們應(yīng)該如何處理呢?

首先,我們需要理解Long數(shù)據(jù)類(lèi)型的結(jié)構(gòu),它是由一個(gè)高位的4個(gè)Byte和低位的4個(gè)Byte組成的數(shù)據(jù)類(lèi)型。因?yàn)長(zhǎng)ong類(lèi)型表示的范圍比Number類(lèi)型大,所以我們?cè)贘avaScript中是使用了兩個(gè)Number類(lèi)型(即Int類(lèi)型)的對(duì)象來(lái)表示Long類(lèi)型數(shù)據(jù),相關(guān)的具體細(xì)節(jié)可以見(jiàn)我之前的博客Long.js源碼分析與學(xué)習(xí)。

理解了JavaScript中如何存儲(chǔ)Long類(lèi)型,我們就知道如果對(duì)其進(jìn)行存儲(chǔ)。

import Long from "long";

let long = Long.fromString("123");
let buffer = new ArrayBuffer(8);
let dataView = new DataView(buffer);

dataView.setInt32(0, long.high); // 采用大端字節(jié)序放置
dataView.setInt32(4, long.low);

通過(guò)上面的示例,我們將一個(gè)Long類(lèi)型的數(shù)據(jù)拆分成了兩個(gè)Int類(lèi)型的數(shù)據(jù),按照大端字節(jié)序放入到了ArrayBuffer中。同理,如果是想按照小端字節(jié)序放置,只需要將數(shù)據(jù)進(jìn)行部分處理后再放入即可,在此我就不過(guò)多介紹了。

如何將二進(jìn)制數(shù)據(jù)中轉(zhuǎn)換為JavaScript中的數(shù)據(jù)類(lèi)型

當(dāng)你知道了如何將數(shù)據(jù)轉(zhuǎn)換為ArrayBuffer中存儲(chǔ)的二進(jìn)制數(shù)據(jù)后,就能夠簡(jiǎn)單推測(cè)出如何進(jìn)行反向操作——將數(shù)據(jù)從ArrayBuffer中讀取出來(lái),再轉(zhuǎn)換成JavaScript中常用數(shù)據(jù)類(lèi)型。

import Long from "long";

let buffer = new ArrayBuffer(14); // 初始化14個(gè)Byte的二進(jìn)制數(shù)據(jù)緩沖區(qū)
let dataView = new DataView(buffer);
let long = Long.fromString("123");


// 數(shù)據(jù)寫(xiě)入過(guò)程

dataView.setInt16(0, 3); // 從第0個(gè)Byte位置開(kāi)始,放置一個(gè)數(shù)字為3的Short類(lèi)型數(shù)據(jù)(占2 Byte)
dataView.setInt32(2, 15); // 從第2個(gè)Byte位置開(kāi)始,放置一個(gè)數(shù)字為15的Short類(lèi)型數(shù)據(jù)(占4 Byte)

dataView.setInt32(6, long.high); // 采用大端字節(jié)序放置
dataView.setInt32(10, long.low);

// 數(shù)據(jù)讀取過(guò)程

let shortNumber = dataView.getInt16(0);
let intNumber = dataView.getInt32(2);

let longNumber = Long.fromBits(dataView.getInt32(10), dataView.getInt32(6)); // 根據(jù)大端字節(jié)序讀取,該構(gòu)造函數(shù)入?yún)⒁来螢椋旱?6位,高16位

通過(guò)上面的示例,我們將一串二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成為了JavaScript中通用的數(shù)據(jù)類(lèi)型。

總結(jié)

通過(guò)使用ArrayBuffer和DataView,我們能夠快速的將數(shù)字?jǐn)?shù)據(jù)從二進(jìn)制轉(zhuǎn)換為JavaScript常用數(shù)據(jù)類(lèi)型如Int、Short等;同時(shí),我們也可以將這些數(shù)據(jù)類(lèi)型轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)。有了這些基礎(chǔ)知識(shí),我們就能夠理解在之后的博客中講到的關(guān)于使用WebSocket進(jìn)行二進(jìn)制數(shù)據(jù)傳遞的過(guò)程和處理邏輯。

下一篇博客我們將介紹String類(lèi)型相關(guān)的二進(jìn)制處理與轉(zhuǎn)換操作,有興趣的同學(xué)可以關(guān)注留意下相關(guān)內(nèi)容。

部分參考資料

阮一峰老師關(guān)于字節(jié)序的介紹

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/93799.html

相關(guān)文章

  • WebSocket系列字符串如何進(jìn)制數(shù)據(jù)間進(jìn)行互相轉(zhuǎn)換

    摘要:總結(jié)通過(guò)使用和,我們能夠在數(shù)據(jù)和二進(jìn)制數(shù)據(jù)中進(jìn)行互相轉(zhuǎn)換。下一篇系列相關(guān)的博客,將會(huì)介紹如何通過(guò)來(lái)向后端傳遞二進(jìn)制數(shù)據(jù),以及如何處理通過(guò)收到的二進(jìn)制數(shù)據(jù)。 概述 上一篇博客我們說(shuō)到了如何進(jìn)行數(shù)字類(lèi)型(如Short、Int、Long類(lèi)型)如何在JavaScript中進(jìn)行二進(jìn)制轉(zhuǎn)換,如果感興趣的可以可以閱讀本系列第二篇博客——WebSocket系列之JavaScript中數(shù)字?jǐn)?shù)據(jù)如何轉(zhuǎn)換為...

    stackfing 評(píng)論0 收藏0
  • WebSocket系列進(jìn)制數(shù)據(jù)設(shè)計(jì)與傳輸

    摘要:本文作為系列的第四篇內(nèi)容,將會(huì)用一個(gè)簡(jiǎn)單的聊天應(yīng)用把整個(gè)傳輸二進(jìn)制數(shù)據(jù)類(lèi)型的內(nèi)容連接起來(lái),讓用戶(hù)對(duì)整個(gè)傳輸二進(jìn)制數(shù)據(jù)的方法有個(gè)了解。如何發(fā)送二進(jìn)制數(shù)據(jù)通過(guò)如何設(shè)計(jì)一個(gè)二進(jìn)制協(xié)議一章,我們知道了如何定義傳輸?shù)亩M(jìn)制數(shù)據(jù)格式。 概述 通過(guò)前三篇博客,我們能夠了解在通過(guò)WebSocket發(fā)送數(shù)據(jù)之前,我們需要傳遞的數(shù)據(jù)是如何變成ArrayBuffer二進(jìn)制數(shù)據(jù)的;在我們收到二進(jìn)制數(shù)據(jù)之后,我...

    amc 評(píng)論0 收藏0
  • WebSocket系列如何建立和維護(hù)可靠的連接

    摘要:與此同時(shí),后端服務(wù)的中也有相關(guān)的長(zhǎng)連接維持時(shí)長(zhǎng)設(shè)置。如何快速的恢復(fù)連接根據(jù)上面的操作方案,我們會(huì)在網(wǎng)絡(luò)異常時(shí)斷開(kāi)連接。 概述 通過(guò)前四篇博客,相信讀者對(duì)于WebSocket的使用和數(shù)據(jù)(不論是ArrayBuffer還是String)傳輸都有了一個(gè)深刻的了解?,F(xiàn)在我們來(lái)介紹下,我在使用WebSocket時(shí),連接相關(guān)模塊遇到的一些共性問(wèn)題,以及我們?nèi)绾谓鉀Q這些問(wèn)題。 本文作為WebSock...

    BetaRabbit 評(píng)論0 收藏0
  • WebSocket系列基礎(chǔ)知識(shí)入門(mén)篇

    摘要:概述本文是系列的第一篇,主要介紹相關(guān)的基礎(chǔ)協(xié)議知識(shí)和??蛻?hù)端收到響應(yīng)后,立即發(fā)起下一次的請(qǐng)求。收到消息通過(guò)事件來(lái)接收消息。類(lèi)型則需要傳遞一個(gè)對(duì)象作為參數(shù),相關(guān)的內(nèi)容也將在本系列第二篇中進(jìn)行介紹。 概述 本文是WebSocket系列的第一篇,主要介紹WebSocket相關(guān)的基礎(chǔ)協(xié)議知識(shí)和API。由于WebSocket的相關(guān)介紹在MDN中分布較亂,初學(xué)者不太容易入門(mén),因此通過(guò)本文將相關(guān)基礎(chǔ)...

    Yuqi 評(píng)論0 收藏0
  • JavaScript 工作原理五-深入理解 WebSockets 和帶有 SSE 機(jī)制的HTTP/

    摘要:幀協(xié)議讓我們深入了解下幀協(xié)議。目前可用的值該幀接續(xù)前面一幀的有效載荷。該幀包含二進(jìn)制數(shù)據(jù)。幀有以下幾類(lèi)長(zhǎng)度表示有效載荷的長(zhǎng)度。數(shù)據(jù)分片有效載荷數(shù)據(jù)可以被分成多個(gè)獨(dú)立的幀。接收端會(huì)緩沖這些幀直到位有值。 原文請(qǐng)查閱這里,略有改動(dòng),本文采用知識(shí)共享署名 3.0 中國(guó)大陸許可協(xié)議共享,BY Troland。 本系列持續(xù)更新中,Github 地址請(qǐng)查閱這里。 這是 JavaScript 工作原...

    lijinke666 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<