首页新闻招聘找找看知识库
  • 回复:2 浏览:1380 2012-06-05 16:39 来自 雷人堂

    我做了一个asn1编码的编译工具,但是写的很糟糕,想不出改用什么模式比较好,我的思路大致是这样的:

    首先我从文件读取了一种特定编码的asn1格式,将其序列化成一个asn1节点类型的树形对象,asn1节点类型大致如下:

    class Asn1Node
    {
        int _type;
        int _length;
        byte[] content;
        IList _children;
    }

    现在我想把Asn1Node编译成另外一种编码格式,如DER,我的方法是为Asn1Node创建对应的DerNode:

    class DerNode
    {
        Asn1Node _node;
        IList _children;
        byte[] _typeRaw;
        byte[] _lengthRaw;

    public:
        void Encode(MemoryStream ms);
    }

    现在的问题是为了满足DerNode编码的需求,Asn1Node必须向DerNode提供数据,有两种方法:
    1. 为Asn1Node添加新的方法,为DerNode提供需要的数据,但是这样的话如果我新添加一个编码类型,比如XmlNode,则我还需要向Asn1Node添加新的方法,为新的类型提供更多的数据。
    2. Asn1Node只为DerNode提供最少的数据,但是这样的话几乎所有需要的数据都由DerNode来计算,但是很有可能我将创建一个新的编码类型,大致上和DER编码差不多,只有很小的区别,这样就会有很多的代码必须重复。

    所以我很觉得这样的设计不是很好,我又想到了使用事件代理之类的方式,直接给Asn1Node添加Encode方法,按顺序遍历一遍Asn1Node树,每次读到数据都通过事件发给观察者,让观察者决定如何编码,但是这样的问题是编码难度太高了,有些编码需要从子节点遍历到根节点,有些算法需要从根节点遍历到子节点,满足了一种编码需求,另外一种编码需要做大量的缓存。。。

    所以在这里请教一下大家,有什么模式适合我的需求?

    附:Asn1各种编码简要解释http://zh.wikipedia.org/wiki/ASN.1

  • ChobitsSP
    2012-10-22 17:44 ChobitsSP
    抽象abstractNode
    Asn1Node,DerNode,XmlNode都继承自abstractNode
    abstractNode存储解析前的数据 每个子类分别进行各自编码的处理方法
    第1楼 回到顶楼
  • Sago
    2014-05-07 16:26 Sago
    我对你说的这个不是很了解。但是我想,如果你的DerNode的数据是从Asn1Node来的,而Asn1Node的数据是从文件中来的。那么,我是否可以认为,你的DerNode也可以直接从文件解析得来。这样,你只是针对文件,有N中不同的解析方式了。类似于工厂吧。根据你的选择,创建不同的解析对象。然后解析。
    第2楼 回到顶楼
登录后才能评论,请先登录注册