aardio 文档

aardio 范例: 兼容 Python struct.pack,struct.unpack 的库

参考范例 - IP 地址转换

//兼容 Python struct.pack,struct.unpack 的库
//参考范例 - IP 地址转换: https://www.aardio.com/zh-cn/doc/example/Network/wsock/ip.html

import raw.pack;
import string.builder;

//-------------------- string.builder -------------------------------

var sb = string.builder();

//连缀式打包,要导入 raw.pack 库才能使用 sb.pack 函数。
sb.pack("<HI",2,2).pack("<b",3);

//传入数组批量打包
sb.pack("<B6s",[
    [1,"1"],
    [1,"12"],
    [1,"太长大短自动处理"] //自动“截长补短”,不必调用 string.left,string.repeat 这些处理输入字符串
])

// 输出结果
print(sb.hex());

//----------------------- raw.pack ----------------------------

//计算二进制格式化串表示数据的字节长度
var size  = raw.pack.sizeof("<10s2HI")

//二进制打包,参数用法与 Python struct.pack 相同
var buffer = raw.pack("<10s2HI","hello",1,2,100);

//二进制解包,展开数组字段( 例如下面的 2H 返回 w2,w3 )
var s1,w2,w3,i4 = raw.pack.unpack("<10s2HI", buffer);

/*
解包迭代器,每次都返回包含所有字段的数组。
不展开数组字段( 例如下面的 2H 返回 WORD[] 数组 )

相当于循环调用 raw.pack.unpackArray 函数。
第一次循环只要 buffer 的长度大于 1 就会执行。
后续会安全地检测剩下的长度是否足够解包,长度不够时退出循环。
*/
for i,v in raw.pack.each("<10s2HI", buffer){
    print(v,i)
}

/*
使用「aardio 工具 » 转换工具 » 原生类型转换」
可以将二进制格式化串自动转换为以下代码(通过调用 raw.pack.getCode 实现):
*/

//<10s2HI
var struct = {
    byte field1[10];
    WORD field2[2]=[];//这里如果不指定数组值则会视为字符串,并自动执行 UTF-16(原生 API) 到 UTF-8(aardio) 的双向转换
    INT field3;
    _struct_aligned=1
}

raw.convert(buffer,struct); //解包
//var buffer = raw.buffer(struct); //打包

print(struct.field2);




Markdown 格式