You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:36:51