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 格式