字符編碼概念及JS中相關應用

Endianness(字節序)

字節序,或字節順序("Endian"、"endianness" 或 "byte-order"),描述了計算機如何組織字節,組成對應的數字。   每一個內存存儲位置都有一個索引或地址。每一 字節能夠存儲一個 8位數字(即 介於0x00 和 0xff 之間 0~255),所以,你必須保留不止一個字節來儲存一個更大的數字。git

  • little-endian 如今,大部分需佔用多個字節的數字排序方式是 little-endian(譯者注:可稱小字節序、低字節序,即低位字節排放在內存的低地址端,高位字節排放在內存的高地址端。與之對應的 big-endian 排列方式相反,可稱大字節序、高字節序),全部的英特爾處理器都使用 little-endian。little-endian 的意思是使用低位儲存更重要的信息,least-to-most-significant(最低有效(least significant)字節取第一個位置,或者說,地址最低的位置),可類比歐洲通用的日期書寫方式(例如,31 December 2050。譯者注:年份是最重要的,月份其次,日期最後)。
  • big-endian 天然, big-endian 是相反的順序, 可類比 ISO 日期格式(例如 2050-12-31)。big-endian 一般被稱做"網絡字節順序"("network byte order"), 由於互聯網標準一般要求數據使用 big-endian 存儲,從標準 Unix 套接字(socket)層開始,一直到標準化網絡的二進制數據結構。此外,老式 Mac 計算機的 68000 系列 和 PowerPC(譯者注:IBM 與 Apple 公司聯合生產的我的臺式機)微處理器曾使用 big-endian。

舉個例子,用不一樣字節序存儲數字 0x12345678(即十進制中的 305 419 896):數組

  • little-endian:0x78 0x56 0x34 0x12
  • big-endian:0x12 0x34 0x56 0x78
  • mixed-endian(文物,很是罕見):0x34 0x12 0x78 0x56

說明:本人理解的字節高位和低位是個方向問題,高位字節從左往右;低位字節從右往左。內存是從左往右,內地地址依次增長一,故文中高地址端指的後面。bash

Base64

Base64是一組類似的二進制到文本(binary-to-text)的編碼規則,使得二進制數據在解釋成radix-64的表現形式後可以用ASCII字符串的格式表示出來。   在JavaScript中,有2個函數分別用來處理解碼和編碼base64 字符串:網絡

  • atob() 解碼
  • btoa() 編碼
let encodedData = window.btoa("Hello, world"); // SGVsbG8sIHdvcmxk
let decodedData = window.atob(encodedData); // "Hello, world")

複製代碼

原碼/反碼/補碼/整形/浮點數

  • 原碼 直接將二進制按照正負數的形式翻譯成二進制就能夠。
  • 反碼 將原碼的符號位不變,其餘位依次按位取反就能夠獲得了。
  • 補碼 反碼+1就獲得補碼。
  • 整型 以2進制本數的補碼存在的;
  • 浮點數 32位(單精度float):對於32位的浮點數,最高的1位是符號位s,接着的8位是指數E,剩下的23位爲有效數字M。 64位(雙精度float):對於64位的浮點數,最高的1位是符號位S,接着的11位是指數E,剩下的52位爲有效數字M。

JS API

  • ArrayBuffer 對象用來表示通用的、固定長度的原始二進制數據緩衝區。 ArrayBuffer 不能直接操做,而是要經過類型數組對象或 DataView 對象來操做,它們會將緩衝區中的數據表示爲特定的格式,並經過這些格式來讀寫緩衝區的內容。
  • SharedArrayBuffer 對象用來表示一個通用的,固定長度的原始二進制數據緩衝區,相似於 ArrayBuffer 對象,它們均可以用來在共享內存(shared memory)上建立視圖。與 ArrayBuffer 不一樣的是,SharedArrayBuffer 不能被分離。
  • Uint8Array 數組類型表示一個8位無符號整型數組,建立時內容被初始化爲0。建立完後,能夠以對象的方式或使用數組下標索引的方式引用數組中的元素。
  • Uint8ClampedArray (8位無符號整型固定數組) 類型化數組表示一個由值固定在0-255區間的8位無符號整型組成的數組; 若是你指定一個在 [0,255] 區間外的值,它將被替換爲0或255;若是你指定一個非整數,那麼它將被設置爲最接近它的整數。(數組)內容被初始化爲0。一旦(數組)被建立,你可使用對象的方法引用數組裏的元素,或使用標準的數組索引語法(即便用方括號標記)。
  • Uint16Array 數組類型表示一個16位無符號整型數組,建立時內容被初始化爲0。建立完後,能夠以對象的方式或使用數組下標索引的方式引用數組中的元素。
  • Uint32Array 數組類型表示一個32位無符號整型數組,建立時內容被初始化爲0。建立完後,能夠以對象的方式或使用數組下標索引的方式引用數組中的元素。
  • Int8Array 類型數組表示二進制補碼8位有符號整數的數組。內容初始化爲0。 一旦創建,你可使用對象的方法引用數組中的元素,或使用標準數組索引語法( 即,使用括號註釋)。
  • Int16Array 類型數組表示二進制補碼16位有符號整數的數組。內容初始化爲0。 一旦創建,你可使用對象的方法引用數組中的元素,或使用標準數組索引語法( 即,使用括號註釋)。
  • Int32Array 類型數組表示二進制補碼32位有符號整數的數組。內容初始化爲0。 一旦創建,你可使用對象的方法引用數組中的元素,或使用標準數組索引語法( 即,使用括號註釋)。
  • Float32Array 類型數組表明的是平臺字節順序爲32位的浮點數型數組(對應於 C 浮點數據類型) 。 若是須要控制字節順序, 使用 DataView 替代。其內容初始化爲0。一旦創建起來,你可使用這個對象的方法對其元素進行操做,或者使用標準數組索引語法 (使用方括號)。
  • Float64Array 類型數組表明的是平臺字節順序爲64位的浮點數型數組(對應於 C 浮點數據類型) 。 若是須要控制字節順序, 使用 DataView 替代。其內容初始化爲0。一旦創建起來,你可使用這個對象的方法對其元素進行操做,或者使用標準數組索引語法 (使用方括號)。
  • DataView 視圖是一個能夠從 ArrayBuffer 對象中讀寫多種數值類型的底層接口,使用它時,不用考慮不一樣平臺的字節序問題。
Type Value Range Size in bytes Description Web IDL type Equivalent C type
Int8Array -128 to 127 1 8-bit two's complement signed integer byte int8_t
Uint8Array 0 to 255 1 8-bit unsigned integer octet uint8_t
Uint8ClampedArray 0 to 255 1 8-bit unsigned integer (clamped) octet uint8_t
Int16Array -32768 to 32767 2 16-bit two's complement signed integer short int16_t
Uint16Array 0 to 65535 2 16-bit unsigned integer unsigned short uint16_t
Int32Array -2147483648 to 2147483647 4 32-bit two's complement signed integer long int32_t
Uint32Array 0 to 4294967295 4 32-bit unsigned integer unsigned long uint32_t
Float32Array 1.2x10-38 to 3.4x1038 4 32-bit IEEE floating point number ( 7 significant digits e.g. 1.1234567) unrestricted float float
Float64Array 5.0x10-324 to 1.8x10308 8 64-bit IEEE floating point number (16 significant digits e.g. 1.123...15) unrestricted double double
BigInt64Array -263 to 263-1 8 64-bit two's complement signed integer bigint int64_t (signed long long)
BigUint64Array 0 to 264-1 8 64-bit unsigned integer bigint uint64_t (unsigned long long)
相關文章
相關標籤/搜索