例如:
我有一个如下所示的二进制文件:
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/