erlang - Elixir 解析二进制数据?

标签 erlang elixir

​例如:

我有一个如下所示的二进制文件:

 bin1 = "2\nok\n3\nbcd\n\n"​

 bin2 = "2\nok\n3\nbcd\n1\na\n\n"​

等等...

格式为

 byte_size  \n  bytes \n byte_size  \n  bytes \n  \n 

我想要解析二进制获取

  ["ok", "bcd"]

如何在 Elixir 或 Erlang 中实现?

Go版本

Go 版本解析此内容

func (c *Client) parse() []string {
    resp := []string{}
    buf := c.recv_buf.Bytes()
    var idx, offset int
    idx = 0
    offset = 0

    for {
        idx = bytes.IndexByte(buf[offset:], '\n')
        if idx == -1 {
            break
        }
        p := buf[offset : offset+idx]
        offset += idx + 1
        //fmt.Printf("> [%s]\n", p);
        if len(p) == 0 || (len(p) == 1 && p[0] == '\r') {
            if len(resp) == 0 {
                continue
            } else {
                c.recv_buf.Next(offset)
                return resp
            }
        }

        size, err := strconv.Atoi(string(p))
        if err != nil || size < 0 {
            return nil
        }
        if offset+size >= c.recv_buf.Len() {
            break
        }

        v := buf[offset : offset+size]
        resp = append(resp, string(v))
        offset += size + 1
    }

    return []string{}
}

谢谢

最佳答案

更灵活的解决方案:

result = bin 
|> String.split("\n") 
|> Stream.chunk(2)
|> Stream.map(&parse_bytes/1)
|> Enum.filter(fn s -> s != "" end)

def parse_bytes(["", ""]), do: ""
def parse_bytes([byte_size, bytes]) do
  byte_size_int = byte_size |> String.to_integer
  <<parsed :: binary-size(byte_size_int)>> = bytes
  parsed
end

关于erlang - Elixir 解析二进制数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24435197/

相关文章:

erlang - 在 Elixir 中获取兄弟进程

elixir - 这些不同的函数定义有何优缺点?

erlang - Cowboy HTTP POST 处理程序

select - Erlang Mnesia 是否在 ordered_set 上选择以 Erlang Term 顺序给出列表?

version-control - Erlang:你如何重新加载应用程序环境配置?

erlang - 运行 wx Erlang 代码时出错

architecture - SOA:为什么不使用 Erlang/OTP Web 服务器作为服务?

sql - 在 SQL 连接查询期间计算 Ecto 中的虚拟字段

docker - 在无人机上运行时无法在 Dockerized Phoenix App 上找到 Hex

elixir - ectocast_assoc 查找或创建