开发Python版.bruh转换器:实现Rust的to_ne_bytes()及反向操作
在Python中重现Rust的
to_ne_bytes()功能及反向操作 Rust的to_ne_bytes()方法用于将整数类型转换为本机原生字节序(当前系统的大端/小端)的固定长度字节数组。Python中可以通过struct模块完全实现等价功能,同时支持反向的字节转数值操作。
核心实现逻辑
Python的struct模块支持指定字节序,其中=前缀代表本机原生字节序,正好对应Rust中to_ne_bytes()的行为。不同整数类型对应的格式符如下:
| Rust类型 | Python struct格式符(带=前缀) | 字节长度 |
|---|---|---|
u8 | =B | 1 |
i8 | =b | 1 |
u16 | =H | 2 |
i16 | =h | 2 |
u32 | =I | 4 |
i32 | =i | 4 |
u64 | =Q | 8 |
i64 | =q | 8 |
实现to_ne_bytes()等价功能
特定类型示例(以u32为例)
import struct # 对应Rust的u32::to_ne_bytes() def to_ne_u32(num: int) -> bytes: return struct.pack('=I', num) # 测试:转换数值为本机字节序字节数组 num = 0x12345678 bytes_data = to_ne_u32(num) # 输出结果取决于系统字节序:小端系统为b'\x78\x56\x34\x12',大端为b'\x12\x34\x56\x78'
通用型实现(支持所有整数类型)
import struct def to_ne_bytes(num: int, fmt: str) -> bytes: """ 等价于Rust的to_ne_bytes() :param num: 要转换的整数 :param fmt: 无字节序前缀的struct格式符,如'I'对应u32,'q'对应i64 """ return struct.pack(f'={fmt}', num) # 示例:转换i64类型数值 num_i64 = -123456789012345 bytes_i64 = to_ne_bytes(num_i64, 'q')
反向操作:字节数组转整数(对应Rust的from_ne_bytes())
特定类型示例(以u32为例)
# 对应Rust的u32::from_ne_bytes() def from_ne_u32(bytes_data: bytes) -> int: return struct.unpack('=I', bytes_data)[0] # 测试:将字节数组转回数值 recovered_num = from_ne_u32(bytes_data) print(recovered_num) # 输出0x12345678
通用型反向实现
def from_ne_bytes(bytes_data: bytes, fmt: str) -> int: """ 等价于Rust的from_ne_bytes() :param bytes_data: 要转换的字节数组 :param fmt: 无字节序前缀的struct格式符,需与转换时的格式符一致 """ return struct.unpack(f'={fmt}', bytes_data)[0] # 示例:将i64字节数组转回数值 recovered_i64 = from_ne_bytes(bytes_i64, 'q') print(recovered_i64) # 输出-123456789012345
注意事项
- 确保传入的整数符合对应类型的取值范围,比如
u8只能接收0-255之间的数值,超出范围会触发struct.error - 反向转换时,字节数组的长度必须与格式符对应的字节长度一致,否则会报错
- 本机字节序由运行代码的系统决定,跨系统传输时建议显式指定大端(
>)或小端(<)字节序,而非依赖原生字节序
内容的提问来源于stack exchange,提问作者Tycho10101
相关产品推荐
相关产品推荐

