Skip to content

6.4.2 - 打包与解包中的格式化字符串

string.packstring.packsize、以及string.unpack中的第一个参数是个格式化字符串,其描述了要创建或读取的结构的布局。

格式化字符串由一系列的转换项组成。这些转换项如下所示:

  • <: 设为小端编码
  • >: 设为大端编码
  • =: 设为原生大小端编码,即跟随本地环境设置。
  • ![n]: 将最大对齐设为 n (默认跟随本地环境设置)。
  • b: 一个有符号字节(char)。
  • B: 一个无符号字节(char)。
  • h: 一个有符号 short(取决于本地环境大小)。
  • H: 一个无符号 short(取决于本地环境大小)。
  • l: 一个有符号的 long(取决于本地环境大小)。
  • L: 一个无符号的 long(取决于本地环境大小)。
  • j: 一个lua_Integer
  • J: 一个lua_Unsigned
  • T: 一个 size_t(取决于本地环境大小)。
  • i[n]: 一个大小为 n 个字节的有符号 int(默认为本地环境大小)。
  • I[n]: 一个大小为 n 个字节的无符号 int(默认为本地环境大小)。
  • f: 一个 float(取决于本地环境大小)。
  • d: 一个 double(取决于本地环境大小)。
  • n: 一个lua_Number
  • cn: 一个固定长度为 n 字节的字符串。
  • z: 一个以零为终止符的字符串。
  • s[n]: 一个由表示长度的 n 字节大小整数(默认是 size_t)打头的字符串。
  • x: 填充一个字节
  • Xop: 一个根据转换项 op (其他的会被忽略)来对齐的空对象。
  • ' ': (空格)无意义,会被忽略。可以用来隔开各个选项以提升可读性。

("[n]"的意思是指一个可选的整数。)除了填充、空格以及设置项("xX <=>!" 这些选项)外,每个选项都需要对应一个在string.pack参数或是string.unpack的结果。

对于 "!n"、"sn"、"in"、以及 "In" 选项,其中的 n 可以是一个1到16之间的整数。所有的整数选项都会检查移除;string.pack会检查所给的值和大小是否合适;string.unpack会检查读取的值是否符合Lua中的整数。对于无符号的选项,Lua解释器也会做类似的无符号数检查。

任何以前缀 "!1=" 开始的格式化字符串的意思是,最大对齐为1字节(即不对齐)并且大小端设置跟随本地环境。

本地的大小端设置假设整个系统要么是大端要么是小端。打包函数无法处理混合大小端模式的行为。

对齐机制如下:对于每个转换项,格式化时会做填充使得数据发生偏移,其偏移量为转换项大小和最大偏移量的最小乘数;其最小乘数必须是2的幂,转换项 "c" 和 "z" 不需要对齐;转换项 "s" 的对齐大小与其开头的整数的大小一致。

string.pack使用零值来做填充并且在string.unpack中会被忽略。