You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TypeScript的Memory类中实现私有十六进制字节数组?

在TypeScript中实现Memory类的私有内存数组

核心实现思路

要存储1字节(对应两位十六进制数字)的内存单元,TypeScript中最适配的是Uint8Array——它是专门用于存储8位无符号整数的类型化数组,每个元素正好覆盖0x00到0xFF的范围(所有两位十六进制组合),且比普通数组更高效,完美契合内存模拟场景。

完整代码实现

class Memory {
  // 私有内存数组,#前缀确保外部无法直接访问
  #memory: Uint8Array;

  // 构造函数接收可寻址内存总大小(比如0x1000对应4KB)
  constructor(addressableSize: number) {
    // 初始化内存数组,长度等于可寻址内存大小
    this.#memory = new Uint8Array(addressableSize);
    
    // 批量初始化所有内存单元为指定十六进制值,这里以0x00为例
    this.#memory.fill(0x00);

    // 可选:单独初始化特定地址,比如给0x10地址设为0xAB
    // this.#memory[0x10] = 0xAB;
  }

  // 读取指定地址的内存值,返回十进制(可自行转为十六进制字符串)
  read(address: number): number {
    // 校验地址合法性
    if (address < 0 || address >= this.#memory.length) {
      throw new Error(`Invalid address: 0x${address.toString(16).padStart(4, '0')}`);
    }
    return this.#memory[address];
  }

  // 写入值到指定地址,自动截断超出1字节的部分
  write(address: number, value: number): void {
    if (address < 0 || address >= this.#memory.length) {
      throw new Error(`Invalid address: 0x${address.toString(16).padStart(4, '0')}`);
    }
    // 确保值在0x00-0xFF范围内,超出则保留低8位
    this.#memory[address] = value & 0xFF;
  }
}

// 使用示例
const ram = new Memory(0x1000); // 创建4KB内存
ram.write(0x0000, 0x42); // 往0x0000地址写入0x42
// 读取并以两位十六进制格式输出
console.log(`Address 0x0000: 0x${ram.read(0x0000).toString(16).padStart(2, '0')}`);

关键细节说明

  • 私有成员:用#memory定义私有数组,TypeScript会强制限制外部代码直接访问,符合封装要求。
  • 十六进制值处理:在TypeScript中直接用0x前缀表示十六进制数,比如0xAB等价于十进制的171,赋值给Uint8Array元素时会自动存储为对应的8位二进制。
  • 初始化方式:fill(0x00)可以快速把所有内存单元初始化为0,也可以通过索引单独设置特定地址的初始值。
  • 合法性校验:读写方法里的地址检查和值截断,避免非法内存访问或超出1字节范围的写入。

内容的提问来源于stack exchange,提问作者Liam Knipper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 14:52:33