如何在Raku中实现Python的bytes.fromhex与to_bytes功能并控制字节序?
Raku实现对应功能及参数控制说明
等效Python功能的完整实现
你提到的Python拼接两个字节串的功能,可以直接用以下Raku代码实现:
sub bytes_add returns Blob { # 等效Python bytes.fromhex('6812') my $bytes_a = Blob.new('6812'.decode('hex')); # 等效Python datetime.now().month.to_bytes(1, byteorder='little', signed=False) # 单字节场景下字节序不影响转换结果,直接用buf8存储即可 my $bytes_b = buf8.new(DateTime.now.month); return $bytes_a ~ $bytes_b; }
字节序(byteorder)控制方法
你提到的1024转换为指定字节序的Buf需求,有两种常用实现方式:
- 使用
pack函数通过模板指定
模板中用后缀区分字节序:<表示小端、>表示大端,位数在前:
# 等效Python (1024).to_bytes(2, byteorder='little'),输出Blob:0x<00 04> my $little_endian = pack('S<', 1024); # 等效Python (1024).to_bytes(2, byteorder='big'),输出Blob:0x<04 00> my $big_endian = pack('S>', 1024);
- 构造Buf时显式传入端序参数
# 得到大端16位无符号Buf:Buf[uint16]:0x<0004> my $be_buf = buf16.new(:big-endian, 1024); # 得到小端16位无符号Buf:Buf[uint16]:0x<0400>,和默认构造结果一致 my $le_buf = buf16.new(:little-endian, 1024);
有符号/无符号(signed)控制方法
- 无符号场景:使用
buf8/buf16/buf32类型,或pack模板中用大写字母(C/S/L) - 有符号场景:使用
buf[int8]/buf[int16]/buf[int32]类型,或pack模板中用小写字母(c/s/l)
示例:
# 等效Python (-1024).to_bytes(2, byteorder='little', signed=True) my $signed_le = pack('s<', -1024);
你提供的示例代码调整
你写的代码中用buf16存储月份会生成2字节数据,如果要匹配Python单字节的行为,改为buf8即可,如果确实需要使用多字节存储,直接在构造时添加端序参数就行:
sub bytes_add { my $bytes_a = pack("H*", '6812'); # 指定大端16位存储月份 my $bytes_b = buf16.new(:big-endian, DateTime.now.month); return $bytes_a ~ $bytes_b; }
内容的提问来源于stack exchange,提问作者chenyf
相关产品推荐
相关产品推荐

