0

我刚刚开始使用 Preon 解码来自无线电的配置数据(频道号、频率、模式、频道名称等)。不同的无线电具有不同的无线电格式,通常完全不同。Preon 似乎是完美的解决方案。并且它是可扩展的。

一台收音机以 BCD 格式存储频率数据(8 位频率存储在 4 个字节中)。所以我想我需要在 Preon 中开发一个 BCD 解码器和编码器。我相信我已经阅读了我可以在网上找到的有关 Preon 的所有信息,但我不知道该怎么做。

如果您已经为 Preon 开发了自定义编解码器,请给我一些关于如何开始的提示。

4

1 回答 1

0

这个问题很老了,但由于 preon 的文档非常糟糕,我将尝试回答其中一些问题,因为我最近对此进行了研究。

Preon 分两个阶段工作: 创建一个可以解码您要求它解码的类的 Mega-Codec 运行编解码器

第一阶段由 CodecFactory 类支持,这些类为第二阶段生成 Codec 类。

要注册一个额外的 CodecFactory,您可以像这样调用 preon:

    DefaultCodecFactory fact = new DefaultCodecFactory();

    CodecFactory someFactory = new DefaultCodecFactory();

    CodecFactory[] additional = new CodecFactory[1];
    additional[0] = someFactory;

    Codec<MyClass> myCodec =  fact.create(null, MyClass.class, additional,
            new CodecDecorator[0], new BindingDecorator[0]);

    MyClass result = Codecs.decode(myCodec, buffer);

只需将 someFactory 替换为您的实际工厂即可。编写实际的工厂比较麻烦,为此您需要实现 create 方法:

public <T> Codec<T> create(AnnotatedElement metadata, Class<T> type,
                           ResolverContext context) {

Preon 主要通过它的工厂列表来寻找一个知道如何处理你要求它反序列化的类中的每个元素的工厂。所以你需要做的是,根据元数据和类型参数,确定当前要反序列化的类属性是否是你想要支持的。最有可能的是,您想添加一个 @BoundBCD 注释,然后检查类似

metadata.getAnnotation(BoundBCD.class)) != null

对于您要处理的那些情况,您应该返回一个至少实现 Codec 接口的解码方法的 Codec 类(您可能还需要实现 getCodecDescriptor,我制作的那个是从列表编解码器复制和粘贴的)

您将希望使用所有相关参数创建此编解码器,例如,如果您的注释有一个大小字段(或者您从类型大小推断它),您应该在返回它之前在您的编解码器中初始化它,如果它是一个边缘表达式,您应该将该表达式保存在编解码器中进行评估。这样,当您使用编解码器的解码功能时,您实际上将拥有运行所需的所有数据,然后您需要做的就是从 BitBuffer 创建适当类型的对象。

于 2015-02-11T04:33:05.427 回答