如何用纯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
相关产品推荐
相关产品推荐

