例如:
我有一个二进制看起来像这样:
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{} }
谢谢
更灵活的解决方案:
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