代码之家  ›  专栏  ›  技术社区  ›  user10717742

用java编写的自定义文件解析器需要改进

  •  0
  • user10717742  · 技术社区  · 2 年前

    我已经用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);
        }
    }
    

    下面是一个完整的示例(可以使用随机数量的数据创建文件,然后将其解析回来):

    0 回复  |  直到 2 年前