摘要:總結通過使用和,我們能夠在數據和二進制數據中進行互相轉換。下一篇系列相關的博客,將會介紹如何通過來向后端傳遞二進制數據,以及如何處理通過收到的二進制數據。
概述
上一篇博客我們說到了如何進行數字類型(如Short、Int、Long類型)如何在JavaScript中進行二進制轉換,如果感興趣的可以可以閱讀本系列第二篇博客——WebSocket系列之JavaScript中數字數據如何轉換為二進制數據。這次,我們來說下string類型的數據如何進行處理。
本文是WebSocket系列的第三篇,主要介紹string數據與二進制數據之間的轉換方法,具體的內容如下:
JavaScript中string類型基礎知識
JavaScript如何將string類型轉換為二進制數據
JavaScript如何將二進制數據轉換為string類型
本文與WebSocket并無太強關聯,不過作為在WebSocket中傳遞二進制數據的基礎知識儲備,因此放入了此系列當中。
如果讀者對WebSocket并不了解,或者說不明白它的使用場景和細節,可以閱讀我的本系列的第一篇博客——WebSocket系列之基礎知識入門篇。
string這個類型,對于熟悉JavaScript的同學應該都不陌生,它是屬于JavaScript中基礎數據類型的一種。不過,我們今天要先介紹下DOMString。
DOMString 是一個UTF-16字符串。由于JavaScript已經使用了這樣的字符串,所以DOMString 直接映射到 一個String。將null傳遞給接受DOMString的方法或參數時通常會把其轉換成為“null”。
在WebSocket中進行string類型數據傳輸時,使用的其實也是DOMString。不過,根據MDN中對DOMString的介紹我們可以了解到,大部分日常使用場景中,我們可以認為DOMString就是一個string類型。所以,我們只需要了解此類型,使用時仍然當成string類型處理即可。
編碼既然上面提到了UTF-16,那么我們就來簡單介紹下UTF-16,以及后端常用的UTF-8這兩種編碼方式。
為什么需要介紹編碼類型呢?因為我們在與后端進行字符串數據傳遞時,可能使用的編碼方式不同,這樣就會導致雙方得到不同的數據。因此,我們在進行string的二進制數據通信時,不僅僅需要將字符串轉換成二進制,還需要協商一致的string編碼。
UTF-16 (16-bit Unicode Transformation Format) 是Unicode字符編碼五層次模型的第三層:字符編碼表(Character Encoding Form,也稱為"storage format")的一種實現方式。即把Unicode字符集的抽象碼位映射為16位長的整數(即碼元)的序列,用于數據存儲或傳遞。
Unicode字符的碼位,需要1個或者2個16位長的碼元來表示,因此這是一個變長表示。
UTF-16是JavaScript中的string編碼類型。
UTF-8UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字符編碼,也是一種前綴碼。它可以用來表示Unicode標準中的任何字元,且其編碼中的第一個字節仍與ASCII兼容,這使得原來處理ASCII字元的軟件無須或只須做少部分修改,即可繼續使用。UTF-8使用一至四個字節為每個字符編碼(2003年11月重新規范)。
UTF-8是很多語言使用的通用編碼類型,在后端應用中非常常見。
JavaScript中UTF16和UTF-8如何進行編碼轉換在Github上有轉換庫GitHub - dcodeIO/utfx: A compact library to encode, decode and convert UTF8 / UTF16 in JavaScript.,通過這個庫,可以將字符串在UTF-8編碼和UTF-16編碼中進行轉換。該庫的具體原理和內容以及兩種編碼方式的詳細內容說明將會在之后的博客中進行講解。我們下面簡單的介紹下它是使用方式:
import utfx from "./util/utfx"; let str = "abcdefg"; let result = []; function stringSource(s) { let i = 0; return function () { return i < s.length ? s.charCodeAt(i++) : null; }; } utfx.encodeUTF16toUTF8(stringSource(str), function (b) { result.push(b); }.bind(this));
同理,該類庫提供了其他的方法:
decodeUTF8toUTF16,將UTF-8的string數據轉換為UTF-16的string數據。
calculateUTF16asUTF8,計算UTF-16編碼的string類型類型轉換為UTF-8后所占Byte長度。
這兩個方法我們在之后的章節中也會用到。
了解了JavaScript中string類型的編碼和在UTF-8和UTF-16之間轉換編碼的方式,下面我們來看下如何將string類型轉換為二進制數據。
首先,我們假定與后端交互時使用的編碼方式為UTF-8,這樣能夠滿足更多的使用場景。如果仍然使用UTF-16的話,則直接忽略轉換編碼的邏輯即可。
簡單介紹下實現思路:我們得到一個需要轉換的字符串后,先知道其長度后,初始化ArrayBuffer中相關參數,將數據放入ArrayBuffer中即可。我們將上面的示例稍作改動:
import utfx from "./util/utfx"; function stringSource(s) { var i = 0; return function () { return i < s.length ? s.charCodeAt(i++) : null; }; } let str = "abcdefg"; let strCodes = stringSource(str); let length = utfx.calculateUTF16asUTF8(strCodes)[1]; let buffer = new ArrayBuffer(length + 4); // 初始化長度為UTF8編碼后字符串長度+4個Byte的二進制緩沖區 let view = new DataView(buffer); let offset = 4; view.setUint32(0, length); // 將長度放置在字符串的頭部 utfx.encodeUTF16toUTF8(stringSource(str), function (b) { view.setUint8(offset++, b); }.bind(this));
通過上面的示例,我們就已經將一個二進制數據根據UTF-8編碼后放入了ArrayBuffer中,同時,將其長度作為一個Unsigned Int類型存儲在了二進制頭部4個Byte的位置。
JavaScript如何將二進制數據轉換為string類型知道了如何將string類型轉換為二進制數據,下面我們看下如何將整個數據從二進制中讀取,轉換回string類型。
根據上面轉換為二進制的過程,我們不難想到相關的二進制轉string類型方法。具體示例如下:
import utfx from "./util/utfx"; let str = "abcdefg"; function stringSource(s) { var i = 0; return function () { return i < s.length ? s.charCodeAt(i++) : null; }; } let strCodes = stringSource(str); let length = utfx.calculateUTF16asUTF8(strCodes)[1]; let buffer = new ArrayBuffer(length + 4); // 初始化長度為UTF8編碼后字符串長度+4個Byte的二進制緩沖區 let view = new DataView(buffer); let offset = 4; // 字符串轉換二進制過程 view.setUint32(0, length); // 將長度放置在字符串的 utfx.encodeUTF16toUTF8(stringSource(str), function (b) { view.setUint8(offset++, b); }.bind(this)); // 二進制轉換字符串過程 let Strlength = view.getUint32(0); offset = 4; let result = []; // Unicode編碼字符 let end = offset + Strlength; utfx.decodeUTF8toUTF16(function () { return offset < end ? view.getUint8(offset++) : null; // 返回null時會退出此轉換函數 }.bind(this), (char) => { console.log(char) result.push(char); }); let strResult = result.reduce((prev, next)=>{ return prev + String.fromCharCode(next); }, "");
通過上面的示例我們可以知道,我們只需要在前面4個Byte中將字符串長度讀取出來,然后再從第4個Byte(從0開始算)的位置開始讀取指定長度的字符串字符編碼即可。最后,我們得到了一個Unicode碼數組,只需要fromCharCode方法即可將其轉換為字符串。
總結通過使用ArrayBuffer和DataView,我們能夠在string數據和二進制數據中進行互相轉換。
有了string類型轉換的相關基礎,讀者就能夠在之后的WebSocket進行二進制數據傳遞時理解相關的內容和處理邏輯。
下一篇WebSocket系列相關的博客,將會介紹如何通過WebSocket來向后端傳遞二進制數據,以及如何處理通過WebSocket收到的二進制數據。有興趣的同學可以繼續關注。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/93842.html
摘要:本文作為系列的第四篇內容,將會用一個簡單的聊天應用把整個傳輸二進制數據類型的內容連接起來,讓用戶對整個傳輸二進制數據的方法有個了解。如何發送二進制數據通過如何設計一個二進制協議一章,我們知道了如何定義傳輸的二進制數據格式。 概述 通過前三篇博客,我們能夠了解在通過WebSocket發送數據之前,我們需要傳遞的數據是如何變成ArrayBuffer二進制數據的;在我們收到二進制數據之后,我...
摘要:概述本文是系列的第一篇,主要介紹相關的基礎協議知識和??蛻舳耸盏巾憫?,立即發起下一次的請求。收到消息通過事件來接收消息。類型則需要傳遞一個對象作為參數,相關的內容也將在本系列第二篇中進行介紹。 概述 本文是WebSocket系列的第一篇,主要介紹WebSocket相關的基礎協議知識和API。由于WebSocket的相關介紹在MDN中分布較亂,初學者不太容易入門,因此通過本文將相關基礎...
摘要:與此同時,后端服務的中也有相關的長連接維持時長設置。如何快速的恢復連接根據上面的操作方案,我們會在網絡異常時斷開連接。 概述 通過前四篇博客,相信讀者對于WebSocket的使用和數據(不論是ArrayBuffer還是String)傳輸都有了一個深刻的了解。現在我們來介紹下,我在使用WebSocket時,連接相關模塊遇到的一些共性問題,以及我們如何解決這些問題。 本文作為WebSock...
摘要:編碼轉換為編碼下面讓我們來看下如何將編碼的數據轉換為編碼的數據。該方法是將碼進行編碼轉換,從而得到編碼的數據。 概述 當你在前端需要通過二進制數據與服務端進行通信時,你可能會遇到二進制數據的編碼問題。大部分服務端的字符串編碼類型都為UTF-8,而JavaScript中字符串編碼類型是UTF-16,因此,你需要一個能夠將字符串在兩種編碼方式間進行轉換的方法。 本文通過對utfx.js這個...
摘要:以和為例,說明中的數字數據如何轉換為二進制數據。對象用來表示通用的固定長度的原始二進制數據緩沖區。中的數字數據如何轉換為二進制數據對和有了一個大概的了解,下面讓我們來看下它是如何進行二進制數據操作的。 概述 本文主要通過對JavaScript中數字數據與二進制數據之間的轉換,讓讀者能夠了解在JavaScript中如何對數字類型(包括但不限于Number類型)進行處理。 二進制數據在日常...
閱讀 720·2023-04-25 17:54
閱讀 2976·2021-11-18 10:02
閱讀 1139·2021-09-28 09:35
閱讀 655·2021-09-22 15:18
閱讀 2857·2021-09-03 10:49
閱讀 3057·2021-08-10 09:42
閱讀 2580·2019-08-29 16:24
閱讀 1262·2019-08-29 15:08