Elixir解析二进制数据?

 白杨树 发布于 2023-01-07 14:55

例如:

我有一个二进制看起来像这样:

 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版本解析了这个

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{}
}

谢谢

1 个回答
  • 更灵活的解决方案:

    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
    

    2023-01-07 14:58 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有