Python中对应Java Arrays.copyOf()(字节数组类型)的等效实现方案咨询
刚好之前在把Java工具类转Python的时候也碰到过这个需求!Python标准库里确实没有直接对应Arrays.copyOf(byte[], int)的内置函数,但用自带的bytes/bytearray操作就能轻松实现,完全不需要第三方库。
最简单的实现(针对bytes对象)
直接利用切片截断,再用ljust()补零就搞定了:
def copy_of(original_bytes: bytes, new_length: int) -> bytes: # 先截断到指定长度,再用\x00补全不足的部分 return original_bytes[:new_length].ljust(new_length, b'\x00')
举个例子测试下:
- 原数组长度大于新长度:
copy_of(b'hello', 3)返回b'hel'(截断) - 原数组长度小于新长度:
copy_of(b'hello', 7)返回b'hello\x00\x00'(补零) - 长度相等的话直接返回原数组的切片,和原数据一致。
针对可变的bytearray
如果你的数据是bytearray类型,也可以用类似逻辑,或者直接转成bytes处理再转回去:
def copy_of_bytearray(original_ba: bytearray, new_length: int) -> bytearray: copied = original_ba[:new_length].copy() if len(copied) < new_length: # 补够缺少的零字节 copied.extend(b'\x00' * (new_length - len(copied))) return copied
或者更偷懒的写法:bytearray(copy_of(original_ba, new_length))
用numpy实现(适合大数据场景)
如果你的项目本来就在用numpy处理字节数据,也可以用numpy的数组操作来实现,但其实有点小题大做了:
import numpy as np def copy_of_numpy(original_bytes: bytes, new_length: int) -> bytes: # 把字节转成numpy的uint8数组 arr = np.frombuffer(original_bytes, dtype=np.uint8) # 创建指定长度的零数组 new_arr = np.zeros(new_length, dtype=np.uint8) # 把原数组的内容复制到新数组(自动截断或留空补零) new_arr[:min(len(arr), new_length)] = arr[:new_length] # 转回bytes return new_arr.tobytes()
总之,最推荐的还是第一个简单的函数,完全用Python内置功能,代码简洁又高效,不需要额外依赖。
内容的提问来源于stack exchange,提问作者Bastien B
相关产品推荐
相关产品推荐

