aardio 文档

raw.pack 库模块帮助文档

使用必读

介绍:

ardio 的 raw.pack 是 Python 的 struct 库的兼容实现。 使用的二进制格式化语法与 Python 相同( 请参考 Python struct 模块文档 )。

工具:

使用「aardio 工具 » 转换工具 » 原生类型转换」 可以将 Python 二进制格式化串自动转换为结构体声明,并生成用结构体打包解包的示例。 使用结构体打包解包仅需要用到内置函数 raw.convert 与 raw.buffer, 不需要引入 raw.pack 库。

aardio 使用结构体处理二进制更为简单,速度也更快,结构体描述二进制数据的可读性也更好。 但是对于大端序格式串使用 raw.pack 会省事一些,这是因为 raw.pack 与 raw.pack.unpack 会自动转换大端序。 但结构体使用的是小端序,大端序要使用 raw.swap 或 math.size64 的 swap 函数手动转换。

函数对比:

有关的 Python 函数与 aardio 函数的对应关系如下。

Python 函数 aardio 函数
struct.pack raw.pack
struct.pack_into raw.pack.into
struct.unpack raw.pack.unpack
struct.unpack_from 返回多值 raw.convert 返回单个结构体
struct.calcsize raw.sizeof 或 raw.calcsize
struct.iter_unpack raw.pack.each

raw.pack, raw.pack.unpack 与 Python 相同处理的都是单个非数组值, 而 raw.pack.unpackArray,raw.pack.getStruct,raw.pack.getCode 都将指定重复次数的格式化字符处理为数组字段。 例如 raw.pack.getCode("@10H") 会返回包含结构体声明的 aardio 代码 { WORD field1[10]; }

raw.pack.getCode 将 Python 的二进制格式化串转换为 aardio 结构体声明, 「aardio 工具 » 转换工具 » 原生类型转换」就是调用 raw.pack.getCode 转换二进制格式化串。

注意 raw.pack 返回的是 buffer 而不是字符串,在 aardio 里大部份函数通常可以用 buffer 替代字符串参数。 可以用 tostring(buffer) 将 buffer 转换为字符串。

格式化字符:

完整的格式化字符请查看 Python 文档,下面仅说明 aardio 中需要注意的一些格式。

范例代码

raw 成员列表 #

raw.pack(format,...) #

参数 @format 指定格式化字符串。
其他不定个数的参数指定待打包的值,也可以传入包含多个参数的单个数组参数。
成功返回字节串( buffer 类型 ),
失败返回 null,错误信息。

为了与 Python 的用法保持一致,
每个打包解包的参数都必须是单个非数组值(数值、字符串、buffer 等)。
但改用 getStruct 或 getCode 可以得到支持数组的 aardio 结构体声明。
将结构体作为参数就以用 raw.convert 解包或调用 raw.buffer 或 raw.tostring 打包。

raw.pack 成员列表 #

用于二进制打包的库。
兼容 Python struct.pack 格式化字符。
raw.pack 与 raw.pack.unpack 会自动处理字节序。
>! 开始的大端序与 aardio 的默认字节序不同需要转换。

导入此库与 string.builder 库可使用 string.builder 的 pack 函数连续或批量打包。

建议应 raw.pack.getCode 获取与打包解包格式化字符串一致的结构体声明,
然后直接使用 raw.convert 解包,使用 raw.buffer 或 raw.tostring 打包。

raw.pack.calcsize(format) #

raw.pack.sizeof 函数的别名。
根据参数 @format 指定的格式化字符串计算打包后的字节长度。
失败返回 0

raw.pack.convert(format,buffer,offset) #

参数 @format 指定格式化字符串。
参数 @buffer 指定需要解包的 buffer 或者字符串。
可选用 @offset 参数指定偏移字节数,默认为 0。
成功返回解包后的结构体对象(指定重复次数的格式字符转为数组) ,失败返回 null,错误信息。

raw.pack.each(format,buffer,offset=0) #

for count,items in raw.pack.each("<10s2HI",buffer){  
    /*  
解包迭代器,每次都返回包含所有字段的数组。  
不展开数组字段( 例如 "2H" 格式化为 WORD[] 数组 )  

相当于循环调用 raw.pack.unpackArray 函数。  
第一次循环只要 buffer 的长度大于 1 就会执行。  
后续会安全地检测剩下的长度是否足够解包,长度不够时退出循环。  

参数 @format 指定格式化字符串。  
兼容 Python struct.unpack 格式化字符。  
参数 @buffer 指定需要解包的 buffer 或者字符串。  
可选用 @offset 参数指定偏移字节数,默认为 0。    
*/  
}

raw.pack.getCode(format) #

根据参数 @format 指定的格式化字符串生成创建结构体的 aardio 代码,支持数组字段。
失败返回 null,错误信息。

此函数调用 raw.pack.getStruct 获取结构体并转换为代码,
细节请参考该函数说明。

raw.pack.getStruct(format) #

根据参数 @format 指定的格式化字符串生成结构体对象,支持数组字段。
无对齐时 _struct_aligned 字段值为 1,否则遵守默认的结构体对齐规则。
无对齐(紧凑结构)时如果巧合了自动对齐规则,则不会添加 _struct_aligned 字段。
成功返回结构体,失败返回 null,错误信息。

raw.pack.into(format,buffer,offset,...) #

参数 @format 指定格式化字符串。
buffer 指定缓冲区( buffer 类型字节串 ) 对象,传 null 值则创建新的 buffer。
offset 指定写入位置的字节偏移量,默认为 0。
其他不定个数的参数指定待打包的值,也可以传入包含多个参数的单个数组参数。
成功返回字节串( buffer 类型 ),
失败返回 null,错误信息。

为了与 Python 的用法保持一致,
每个打包解包的参数都必须是单个非数组值(数值、字符串、buffer 等)。
但改用 getStruct 或 getCode 可以得到支持数组的 aardio 结构体声明。
将结构体作为参数就以用 raw.convert 解包或调用 raw.buffer 或 raw.tostring 打包。

raw.pack.reverse(buffer,index,size) #

原地转换字节序。
参数 buffer 指定字节串( buffer 类型 )。
此函数不会检查参数 @buffer 的类型,调用者有责任传入正确的类型。
参数 @index 指定开始转换的索引,起始索引为 1。
参数 @size 指定要转换的字节长度。

raw.pack.sizeof(format) #

根据参数 @format 指定的格式化字符串计算打包后的字节长度。
失败返回 0

raw.pack.unpack(format,buffer,offset) #

参数 @format 指定格式化字符串。
兼容 Python struct.unpack 格式化字符。
参数 @buffer 指定需要解包的 buffer 或者字符串。
可选用 @offset 参数指定偏移字节数,默认为 0。
顺序返回解包成功的一个或多个值(指定重复次数的格式字符返回多个值而非数组)。

raw.pack.unpackArray(format,buffer,offset) #

参数 @format 指定格式化字符串。
兼容 Python struct.unpack 格式化字符。
参数 @buffer 指定需要解包的 buffer 或者字符串。
可选用 @offset 参数指定偏移字节数,默认为 0。

此函数默认将指定重复次数的格式字符解包为单个数组值,
如果参数 @4 为 false 则展开数组为多个值

成功返回一个包含所有解包值的数组,失败无返回值。

Markdown 格式