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 字符串:網絡
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) |