Elixir二进制匹配:结合bytes与integer实现自定义文件打包
把Little-Endian 32位匹配和字节大小检查合并到Elixir单一模式中
嘿,这个需求完全可以通过Elixir的二进制模式匹配直接实现,根本不需要分开处理字节大小和字节序——Elixir的语法本身就支持把这两个条件整合到同一个模式里!
核心思路很简单:你要的是4字节(32比特)的小端序无符号整数,在Elixir的二进制匹配语法里,可以直接用<<value::little-unsigned-32>>来表示这个模式。这里的每个部分各司其职:
little:指定字节序为小端(低位字节在前)unsigned:表示无符号整数(如果需要有符号就换成signed)32:表示数据占32比特,也就是4字节——Elixir会自动对应到bytes-size(4)的要求,完全不用额外声明字节数。
直接上代码示例
比如你提到的<<1, 0, 0, 0>>,用这个模式匹配就能直接解析出正确的数值:
defmodule FilePacker do # 匹配4字节小端32位无符号整数 def extract_32bit_little(<<num::little-unsigned-32>>) do {:ok, num} end # 处理不匹配的情况 def extract_32bit_little(_invalid_binary) do {:error, :invalid_32bit_little} end end # 测试验证 FilePacker.extract_32bit_little(<<1, 0, 0, 0>>) # 返回 {:ok, 1} FilePacker.extract_32bit_little(<<0, 0, 0, 1>>) # 返回 {:ok, 16777216}(对应小端序的0x01000000)
整合到更复杂的文件结构中
如果你的文件有固定的语法格式(比如开头有魔数、后面跟着其他字段),可以把这个模式直接嵌入到更大的二进制匹配里,比如:
def parse_custom_file(<<0x42, 0x49, 0x4E, 0x01, # 4字节魔数 version::little-unsigned-32, # 我们要的32位小端版本号 content_length::little-unsigned-32, content::binary-size(content_length), rest::binary>>) do {:ok, %{version: version, content: content, remaining: rest}} end
这样就能一次性匹配整个文件结构,同时满足你的字节大小和字节序要求。
内容的提问来源于stack exchange,提问作者DarkyZ
相关产品推荐
相关产品推荐

