import{_ as t,c as n,o as a,a4 as l}from"./chunks/framework.Cy9JvDAg.js";const _=JSON.parse('{"title":"6.4.2 - 打包与解包中的格式化字符串","description":"","frontmatter":{"title":"6.4.2 - 打包与解包中的格式化字符串","footer":true,"lastUpdated":true,"outline":"deep"},"headers":[],"relativePath":"6.4.2.md","filePath":"6.4.2.md"}'),r={name:"6.4.2.md"},o=l('<h3 id="_6-4-2-打包与解包中的格式化字符串" tabindex="-1">6.4.2 - 打包与解包中的格式化字符串 <a class="header-anchor" href="#_6-4-2-打包与解包中的格式化字符串" aria-label="Permalink to &quot;6.4.2 - 打包与解包中的格式化字符串&quot;">​</a></h3><p>在<a href="/lua5.4-manual-zh/6.4.html#string.pack">string.pack</a>、<a href="/lua5.4-manual-zh/6.4.html#string.packsize">string.packsize</a>、以及<a href="/lua5.4-manual-zh/6.4.html#string.unpack">string.unpack</a>中的第一个参数是个格式化字符串，其描述了要创建或读取的结构的布局。</p><p>格式化字符串由一系列的转换项组成。这些转换项如下所示：</p><ul><li><strong>&lt;:</strong> 设为小端编码</li><li><strong>&gt;:</strong> 设为大端编码</li><li><strong>=:</strong> 设为原生大小端编码，即跟随本地环境设置。</li><li><strong>![<em>n</em>]:</strong> 将最大对齐设为 n (默认跟随本地环境设置)。</li><li><strong>b:</strong> 一个有符号字节（char）。</li><li><strong>B:</strong> 一个无符号字节（char）。</li><li><strong>h:</strong> 一个有符号 short（取决于本地环境大小）。</li><li><strong>H:</strong> 一个无符号 short（取决于本地环境大小）。</li><li><strong>l:</strong> 一个有符号的 long（取决于本地环境大小）。</li><li><strong>L:</strong> 一个无符号的 long（取决于本地环境大小）。</li><li><strong>j:</strong> 一个<a href="/lua5.4-manual-zh/4.6.html#lua_Integer">lua_Integer</a>。</li><li><strong>J:</strong> 一个<a href="/lua5.4-manual-zh/4.6.html#lua_Unsigned">lua_Unsigned</a>。</li><li><strong>T:</strong> 一个 size_t（取决于本地环境大小）。</li><li><strong>i[<em>n</em>]:</strong> 一个大小为 n 个字节的有符号 int（默认为本地环境大小）。</li><li><strong>I[<em>n</em>]:</strong> 一个大小为 n 个字节的无符号 int（默认为本地环境大小）。</li><li><strong>f:</strong> 一个 float（取决于本地环境大小）。</li><li><strong>d:</strong> 一个 double（取决于本地环境大小）。</li><li><strong>n:</strong> 一个<a href="/lua5.4-manual-zh/4.6.html#lua_Number">lua_Number</a>。</li><li><strong>c<em>n</em>:</strong> 一个固定长度为 n 字节的字符串。</li><li><strong>z:</strong> 一个以零为终止符的字符串。</li><li><strong>s[n]:</strong> 一个由表示长度的 n 字节大小整数（默认是 size_t）打头的字符串。</li><li><strong>x:</strong> 填充一个字节</li><li><strong>X<em>op</em>:</strong> 一个根据转换项 op （其他的会被忽略）来对齐的空对象。</li><li><strong>&#39; &#39;:</strong> (空格)无意义，会被忽略。可以用来隔开各个选项以提升可读性。</li></ul><p>（&quot;[<em>n</em>]&quot;的意思是指一个可选的整数。）除了填充、空格以及设置项（&quot;xX &lt;=&gt;!&quot; 这些选项）外，每个选项都需要对应一个在<a href="/lua5.4-manual-zh/6.4.html#string.pack">string.pack</a>参数或是<a href="/lua5.4-manual-zh/6.4.html#string.unpack">string.unpack</a>的结果。</p><p>对于 &quot;!<em>n</em>&quot;、&quot;s<em>n</em>&quot;、&quot;i<em>n</em>&quot;、以及 &quot;I<em>n</em>&quot; 选项，其中的 <em>n</em> 可以是一个1到16之间的整数。所有的整数选项都会检查移除；<a href="/lua5.4-manual-zh/6.4.html#string.pack">string.pack</a>会检查所给的值和大小是否合适；<a href="/lua5.4-manual-zh/6.4.html#string.unpack">string.unpack</a>会检查读取的值是否符合Lua中的整数。对于无符号的选项，Lua解释器也会做类似的无符号数检查。</p><p>任何以前缀 &quot;!1=&quot; 开始的格式化字符串的意思是，最大对齐为1字节（即不对齐）并且大小端设置跟随本地环境。</p><p>本地的大小端设置假设整个系统要么是大端要么是小端。打包函数无法处理混合大小端模式的行为。</p><p>对齐机制如下：对于每个转换项，格式化时会做填充使得数据发生偏移，其偏移量为转换项大小和最大偏移量的最小乘数；其最小乘数必须是2的幂，转换项 &quot;c&quot; 和 &quot;z&quot; 不需要对齐；转换项 &quot;s&quot; 的对齐大小与其开头的整数的大小一致。</p><p><a href="/lua5.4-manual-zh/6.4.html#string.pack">string.pack</a>使用零值来做填充并且在<a href="/lua5.4-manual-zh/6.4.html#string.unpack">string.unpack</a>中会被忽略。</p>',10),s=[o];function i(e,g,u,m,h,p){return a(),n("div",null,s)}const f=t(r,[["render",i]]);export{_ as __pageData,f as default};
