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

如何在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需求,有两种常用实现方式:

  1. 使用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);
  1. 构造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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:45:04