JS `ArrayBuffer` 与 `TypedArray`:处理二进制数据的底层结构

大家好,欢迎来到今天的 “二进制数据大冒险” 讲座!我是你们的导游,将带大家深入 JS 的 ArrayBufferTypedArray 的奇妙世界。准备好了吗?让我们开始吧!

第一站:ArrayBuffer – 原始的二进制容器

想象一下,你有一个巨大的箱子,里面可以存放各种东西,但箱子本身并不知道里面装的是什么。这就是 ArrayBuffer。它只是一个原始的、固定大小的内存块,用于存储二进制数据。

  • 创建 ArrayBuffer:

    // 创建一个 16 字节的 ArrayBuffer
    const buffer = new ArrayBuffer(16);
    
    console.log(buffer.byteLength); // 输出:16

    这里的 byteLength 属性告诉你这个箱子有多大(以字节为单位)。

  • ArrayBuffer 的局限性:

    ArrayBuffer 本身并不能直接读取或写入数据。它就像一个空的容器,你需要一些工具才能操作里面的内容。这就是 TypedArray 的用武之地。

第二站:TypedArray – 数据类型的解释器

TypedArray 是对 ArrayBuffer 的一种“视图”。它告诉 JavaScript 如何将 ArrayBuffer 中的二进制数据解释为特定的数据类型,比如整数、浮点数等等。

  • 常见的 TypedArray 类型:

    类型 描述 字节大小
    Int8Array 8 位有符号整数 1
    Uint8Array 8 位无符号整数 1
    Int16Array 16 位有符号整数 2
    Uint16Array 16 位无符号整数 2
    Int32Array 32 位有符号整数 4
    Uint32Array 32 位无符号整数 4
    Float32Array 32 位浮点数 (单精度) 4
    Float64Array 64 位浮点数 (双精度) 8
    BigInt64Array 64 位有符号大整数 (ES2020) 8
    BigUint64Array 64 位无符号大整数 (ES2020) 8
  • 创建 TypedArray:

    // 基于已有的 ArrayBuffer 创建一个 Int32Array
    const buffer = new ArrayBuffer(16);
    const intArray = new Int32Array(buffer);
    
    console.log(intArray.length); // 输出:4 (16 字节 / 4 字节/int = 4 个元素)

    或者,你也可以直接指定 TypedArray 的长度,它会自动创建一个相应的 ArrayBuffer

    const floatArray = new Float32Array(4); // 创建一个能存储 4 个 float32 的 TypedArray
    console.log(floatArray.buffer.byteLength); // 输出: 16

    记住,TypedArraylength 属性表示的是元素的数量,而不是字节数。要获取底层 ArrayBuffer 的大小,你需要访问 typedArray.buffer.byteLength

  • 读写数据:

    const buffer = new ArrayBuffer(8);
    const uint8Array = new Uint8Array(buffer);
    
    uint8Array[0] = 42; // 设置第一个字节的值为 42
    uint8Array[1] = 255; // 设置第二个字节的值为 255
    
    console.log(uint8Array[0]); // 输出:42
    console.log(uint8Array[1]); // 输出:255

    你可以像操作普通数组一样操作 TypedArray,但只能存储符合其数据类型的值。

第三站:DataView – 精确控制字节顺序

DataView 是另一种访问 ArrayBuffer 的方式,它提供了更灵活的字节级别的读写控制,特别是在处理不同字节序(endianness)的数据时非常有用。

  • 什么是字节序?

    字节序指的是多字节数据类型(比如 32 位整数)在内存中存储的顺序。有两种主要的字节序:

    • 大端序 (Big-Endian): 最高有效字节 (MSB) 存储在最低的内存地址。
    • 小端序 (Little-Endian): 最低有效字节 (LSB) 存储在最低的内存地址。

    不同的系统和协议使用不同的字节序。

  • 创建 DataView:

    const buffer = new ArrayBuffer(8);
    const dataView = new DataView(buffer);
  • 使用 DataView 读写数据:

    const buffer = new ArrayBuffer(4);
    const dataView = new DataView(buffer);
    
    // 以大端序写入一个 32 位整数
    dataView.setInt32(0, 0x12345678, false); // offset, value, littleEndian (false for big-endian)
    
    // 以小端序读取一个 32 位整数
    const value = dataView.getInt32(0, true); // offset, littleEndian (true for little-endian)
    console.log(value); // 输出:取决于系统的字节序。如果系统是小端序,输出 0x78563412

    DataView 提供了很多方法来读取和写入不同类型的数据,比如 getInt8(), getUint16(), getFloat32(), setInt32(), setFloat64() 等等。 每个方法都接受一个 offset 参数,指定从 ArrayBuffer 的哪个位置开始读写。 还有一个littleEndian参数,指定是否使用小端序。

第四站:实战演练 – 图片处理

让我们用一个实际的例子来演示 ArrayBufferTypedArray 的应用:读取图片的像素数据。

假设我们有一个简单的图片格式,每个像素用 3 个字节表示:红色、绿色和蓝色 (RGB)。


<img id="myImage" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w+r8AAAAAAD//xccwJoAAAB0SURBVAjXY/h/q+Hw/u+HBhA5zEwM8jYGBoZGLgY0ZgYGBkY+RhZGBlZ6BkhmBgYGRj5GFkYGRnoGSCYGBgZGfkYWRAYGegZIJgYGBkZ+RhaGBgZ6BkgmBgYGBn5GFoYGBnoGSCYGBgY+RhZGBlZ6BkhmBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj5GFkYGRnoGSCYGBgYGRj

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注