鸿蒙应用开发--基础知识: ArrayBuffer处理二进制数据的核心对象
是内存空间的一部分,内存空间预留了一部分空间叫缓冲区.缓冲区存在的必要性:因为读写内存中的数据比读写磁盘上的数据快,如下图磁盘与缓冲区之间是通过DMA技术进行传输,无需CPU处理,提高磁盘读写效率,应用程序通过Buffer对象的get方法读取缓冲区的数据缓冲区的数据读取完之后,通过channel方法补充数据。



缓冲区Buffer
是内存空间的一部分,内存空间预留了一部分空间叫缓冲区.
缓冲区存在的必要性:因为读写内存中的数据比读写磁盘上的数据快,如下图
磁盘与缓冲区之间是通过DMA技术进行传输,无需CPU处理,提高磁盘读写效率,

应用程序通过Buffer对象的get方法读取缓冲区的数据

缓冲区的数据读取完之后,通过channel方法补充数据
Arraybuffer是一个黑盒–下面的视频很有用



在 HarmonyOS/OpenHarmony 应用开发中,ArrayBuffer 是 JavaScript 中用于处理 二进制数据 的核心对象,它表示一个通用的、固定长度的原始二进制数据缓冲区。以下从基础概念到实际应用场景的完整解析:
一、ArrayBuffer 核心特性
| 特性 | 说明 |
|---|---|
| 不可变性 | 创建后长度固定,无法直接修改(需通过视图对象操作) |
| 内存分配 | 分配连续的二进制内存空间,适合高效处理音频、图片、协议数据等 |
| 平台无关性 | 字节序(大端/小端)由视图对象(如 DataView)控制 |
| 兼容性 | 所有 HarmonyOS API 支持二进制交互的场景均可使用 |
二、创建与基础操作
1. 创建 ArrayBuffer
// 创建 8 字节的缓冲区
const buffer = new ArrayBuffer(8);
console.log(buffer.byteLength); // 输出: 8
2. 通过视图操作数据
ArrayBuffer 需通过 类型化数组 或 DataView 访问:
// 使用 Uint8Array 视图(无符号 8 位整数)
const uint8View = new Uint8Array(buffer);
uint8View[0] = 0xFF; // 第一个字节写入 255
// 使用 DataView(支持灵活字节操作)
const dataView = new DataView(buffer);
dataView.setInt16(2, 1000, true); // 从偏移量2写入小端Int16数值1000
三、HarmonyOS 中的典型应用场景
1. 文件系统操作
使用 @ohos.file.fs 模块读写二进制文件:
import fs from '@ohos.file.fs';
// 读取文件到 ArrayBuffer
const filePath = 'internal://app/files/image.jpg';
const fd = fs.openSync(filePath, fs.OpenFlags.READ_ONLY);
const fileInfo = fs.statSync(filePath);
const buffer = new ArrayBuffer(fileInfo.size);
fs.readSync(fd, buffer); // 数据填充到 buffer
fs.closeSync(fd);
// 写入 ArrayBuffer 到新文件
const outputPath = 'internal://app/files/copy.jpg';
const fdOut = fs.openSync(outputPath, fs.OpenFlags.CREATE | fs.OpenFlags.READ_WRITE);
fs.writeSync(fdOut, buffer);
fs.closeSync(fdOut);
2. 网络通信
处理二进制协议或文件上传:
import http from '@ohos.net.http';
// 上传图片二进制数据
const httpRequest = http.createHttp();
const buffer = ...; // 从文件读取的 ArrayBuffer
httpRequest.request(
"https://api.example.com/upload",
{
method: http.RequestMethod.POST,
extraData: buffer,
header: { 'Content-Type': 'application/octet-stream' }
},
(err, data) => { /* 处理响应 */ }
);
3. 加解密操作
结合 @ohos.security.huks 进行数据加密:
import huks from '@ohos.security.huks';
async function encryptData(plainText: string): Promise<ArrayBuffer> {
const keyAlias = 'my_aes_key';
const plainBuffer = new TextEncoder().encode(plainText);
const encryptResult = await huks.encrypt({ alias: keyAlias, data: plainBuffer });
return encryptResult.data; // 返回加密后的 ArrayBuffer
}
四、与 Node.js Buffer 的对比
| 特性 | ArrayBuffer | Node.js Buffer |
|---|---|---|
| 所属标准 | ECMAScript 标准 | Node.js 特有 |
| 操作方式 | 需通过视图(TypedArray/DataView) | 直接操作 |
| 内存管理 | 手动控制 | 自动内存回收(V8 引擎管理) |
| 使用场景 | 浏览器/跨平台应用 | 仅限 Node.js 环境 |
五、关键技巧
1. 类型化数组转换
// ArrayBuffer ↔ Uint8Array
const uint8Array = new Uint8Array(buffer);
const newBuffer = uint8Array.buffer;
// ArrayBuffer ↔ 字符串
const decoder = new TextDecoder('utf-8');
const str = decoder.decode(uint8Array);
const encoder = new TextEncoder();
const strBuffer = encoder.encode("Hello").buffer;
2. 合并多个 ArrayBuffer
function concatBuffers(buffers: ArrayBuffer[]): ArrayBuffer {
const totalLength = buffers.reduce((acc, buf) => acc + buf.byteLength, 0);
const result = new Uint8Array(totalLength);
let offset = 0;
buffers.forEach(buf => {
result.set(new Uint8Array(buf), offset);
offset += buf.byteLength;
});
return result.buffer;
}
六、内存管理注意事项
-
及时释放引用:
不再使用的ArrayBuffer应及时解除引用,方便垃圾回收。let largeBuffer = new ArrayBuffer(1024 * 1024 * 100); // 100MB // 使用后释放 largeBuffer = null; -
避免内存泄漏:
使用fs模块时,确保关闭文件描述符:const fd = fs.openSync(...); try { // 操作文件... } finally { fs.closeSync(fd); }
七、调试技巧
通过十六进制查看 ArrayBuffer 内容:
function bufferToHex(buffer: ArrayBuffer): string {
return Array.from(new Uint8Array(buffer))
.map(b => b.toString(16).padStart(2, '0'))
.join(' ');
}
const buf = new Uint8Array([0x48, 0x65, 0x6c, 0x6c, 0x6f]).buffer;
console.log(bufferToHex(buf)); // 输出: 48 65 6c 6c 6f
掌握 ArrayBuffer 的使用,能够高效处理 HarmonyOS 中的二进制数据交互场景(如文件、网络、加密等),是进阶开发的必备技能。
更多推荐





所有评论(0)