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

如何用纯Python实现TypeScript中Uint8Array与Uint16Array的等效操作?

Python实现TypeScript中Uint16Array转Uint8Array的等效逻辑

等效类型对应

  • TypeScript的Uint16Array:Python中可使用array.array('H')(标准库array模块的无符号16位整数数组),或通过struct模块打包16位无符号整数模拟其字节存储。
  • TypeScript的Uint8Array:Python中对应array.array('B')(无符号字节数组)、bytearray、bytes,也可通过memoryview创建字节视图。

实现方案

TypeScript代码的核心是将16位整数的底层字节缓冲区以8位无符号整数视角读取,需匹配小端字节序(主流x86架构下,TypeScript默认用小端存储Uint16Array)。

方法1:array+memoryview(模拟缓冲区视图共享)

此方式最贴近TypeScript“共享缓冲区视图”的逻辑,无需复制数据:

import array
import sys

# 创建对应Uint16Array的16位无符号整数数组
uint16_arr = array.array('H', [64])
# 强制转为小端字节序,匹配TypeScript默认行为
if sys.byteorder == 'big':
    uint16_arr.byteswap()

# 生成对应ArrayBuffer的内存视图
buffer = memoryview(uint16_arr)
# 将内存视图转为Uint8Array等效的字节视图
uint8_arr = buffer.cast('B')

# 输出结果
print('uint16_arr:', uint16_arr)
print('buffer:', buffer)
print('uint8_arr:', uint8_arr.tolist())  # 输出 [64, 0]

# 一步实现目标逻辑
data = memoryview(array.array('H', [64])).cast('B').tolist()
print('data:', data)  # 输出 [64, 0]

方法2:struct模块(直接控制字节存储)

若无需共享缓冲区,仅需得到相同字节序列,用struct打包更直接,且不受主机字节序影响:

import struct

# 以小端字节序打包16位无符号整数64,得到对应Uint16Array的字节数据
packed_bytes = struct.pack('<H', 64)
# 转为Uint8Array等效的bytearray
uint8_arr = bytearray(packed_bytes)

# 输出结果
print('uint8_arr:', uint8_arr)  # 输出 bytearray(b'@\x00')
print('data:', list(uint8_arr))  # 输出 [64, 0]

为什么直接用bytearray效果不符?

你之前尝试的bytearray未达到预期,是因为bytearray([64])仅创建了包含单个字节0x40的数组,而没有将16位整数64拆解为其底层的两个字节存储(小端下为0x40 0x00)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 11:57:43