我已经用java为结构化二进制文件编写了解析器。
文件的每个字段都以相同的方式开始:它以特定字节(介绍人)、字段长度、字段类型和字段数据开始。
E、 g.(十六进制):420011010203。。。
将是:
介绍人:42
字段长度:0011->17字节
字段类型:0A
数据:010203。。。
但是我编写解析器的方式感觉有点麻烦,尤其是关于读取/解释字段数据的部分。我想问你,是否有更好的方法,甚至是标准的方法来解决这个问题。我指的是这部分:
package example;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Converter {
private static final Map<String, Convert<Node, ?>> map = new HashMap<>();
static {
map.put("0A", Converter::getTypeA);
map.put("0B", Converter::getTypeB);
map.put("0C", Converter::getTypeC);
}
public static Node convert(Node node) {
return (Node) map.get(node.getIdentifier()).convert(node);
}
private static Node getTypeA(Node node) {
int id = Util.toInteger(new byte[]{node.getData()[4], node.getData()[5]});
String value = Util.toString(node.getData(), 6);
return new TypeA(node.getPosition(), node.getLength(), node.getIdentifier(), node.getData(), id, value);
}
private static Node getTypeB(Node node) {
int id = Util.toInteger(new byte[]{node.getData()[4], node.getData()[5]});
List<String> values = new ArrayList<>();
int offset = 6;
while(offset < node.getData().length) {
int length = node.getData()[offset] & 0xFF;
values.add(Util.toString(node.getData(), offset + 1, length));
offset += 1 + length;
}
return new TypeB(node.getPosition(), node.getLength(), node.getIdentifier(), node.getData(), id, values);
}
private static Node getTypeC(Node node) {
String value = Util.toString(node.getData(), 4, 8);
byte[] data = new byte[node.getData().length - value.length()];
return new TypeC(node.getPosition(), node.getLength(), node.getIdentifier(), node.getData(), value, data);
}
}
下面是一个完整的示例(可以使用随机数量的数据创建文件,然后将其解析回来):