JavaScript 提供了强大的处理二进制数据和各种格式之间转换的能力。在这篇总结中,我们将深入探讨 JavaScript 中的二进制操作及其相关转换,并包含代码示例。
1. 二进制表示
在 JavaScript 中,数字通常以 64 位浮点数表示(符合 IEEE 754 标准),但二进制字面量和位运算符则基于 32 位整数进行操作。你可以使用 0b
前缀来表示二进制字面量。
let binaryNum = 0b1010; // 二进制的 10
console.log(binaryNum); // 输出: 10
2. 位运算符
JavaScript 中的位运算符基于 32 位整数进行操作。常见的位运算符包括:
- AND (
&
):对每个位执行逻辑与操作。 - OR (
|
):对每个位执行逻辑或操作。 - XOR (
^
):对每个位执行逻辑异或操作。 - NOT (
~
):对每个位进行取反操作。 - 左移 (
<<
):将位向左移动指定数量的位。 - 右移 (
>>
):将位向右移动指定数量的位(保留符号位)。
示例:
let a = 5; // 二进制: 0101
let b = 3; // 二进制: 0011
console.log(a & b); // 输出: 1 (二进制: 0001)
console.log(a | b); // 输出: 7 (二进制: 0111)
console.log(a ^ b); // 输出: 6 (二进制: 0110)
console.log(~a); // 输出: -6 (二进制: 1010, 因为在 JavaScript 中是补码形式)
console.log(a << 1); // 输出: 10 (二进制: 1010)
console.log(a >> 1); // 输出: 2 (二进制: 0010)
3. 数字与二进制字符串之间的转换
数字转二进制字符串
JavaScript 提供了 toString
方法可以将数字转换为二进制字符串。
let num = 10;
let binaryStr = num.toString(2);
console.log(binaryStr); // 输出: "1010"
二进制字符串转数字
可以使用 parseInt
方法将二进制字符串转换为数字。
let binaryStr = "1010";
let num = parseInt(binaryStr, 2);
console.log(num); // 输出: 10
4. Buffer 和 TypedArray
在处理二进制数据时,JavaScript 提供了 Buffer
(Node.js 中)和 TypedArray
,它们用于处理原始二进制数据。
使用 Buffer (Node.js)
let buf = Buffer.from([0x1, 0x2, 0x3, 0x4]);
console.log(buf); // 输出: <Buffer 01 02 03 04>
使用 TypedArray (浏览器和 Node.js)
let buffer = new ArrayBuffer(4); // 创建一个 4 字节的缓冲区
let view = new Uint8Array(buffer); // 创建一个 8 位无符号整数的视图
view[0] = 1;
view[1] = 2;
view[2] = 3;
view[3] = 4;
console.log(view); // 输出: Uint8Array(4) [1, 2, 3, 4]
5. 二进制与 Base64 之间的转换
Base64 编码常用于将二进制数据转换为文本字符串,以便在文本协议中传输(如 HTTP)。在 JavaScript 中可以使用 btoa
和 atob
方法。
二进制数据转 Base64
let binaryStr = "Hello, world!";
let base64Str = btoa(binaryStr);
console.log(base64Str); // 输出: "SGVsbG8sIHdvcmxkIQ=="
Base64 转二进制数据
let base64Str = "SGVsbG8sIHdvcmxkIQ==";
let binaryStr = atob(base64Str);
console.log(binaryStr); // 输出: "Hello, world!"
6. 使用 DataView 处理复杂的二进制数据
DataView
允许在 ArrayBuffer
上进行更多样化的操作,可以按任意字节序和数据类型读取和写入数据。
示例:读取 32 位整数
let buffer = new ArrayBuffer(4);
let view = new DataView(buffer);
view.setInt32(0, 25, true); // 写入一个 32 位整数,little-endian
console.log(view.getInt32(0, true)); // 输出: 25
结论
通过以上内容,我们可以看出,JavaScript 提供了多种处理二进制数据的方法,从简单的位运算到更复杂的 Buffer
和 TypedArray
,以及二进制数据和其他格式(如 Base64)之间的转换。这些工具在现代 Web 开发和 Node.js 开发中非常有用,可以帮助开发者更高效地处理二进制数据。