java - 使用 Preon 框架进行简单算术

标签 java math decode arithmetic-expressions preon

我正在使用 Preon Binding 来读取传入的二进制数据流。

我们遇到的问题是某些字段值需要一些简单的算术才能正确表示,正如我们的“数据文档”所述:

  • 字段 lat:设备坐标的纬度分量。二进制形式 格式纬度必须除以 1.000.000
  • 磁场方向:设备的方位角除以 3

Preon 可以在绑定(bind)时支持此类算术吗?还是我必须在解码后专门执行此操作(这会导致解码后的 DTO 值不一致)?

其他字段(latPositive 和 lngPositive)为其相应值(lat 和 lng 字段)提供数学符号(负数或正数),我认为这也可以通过在负数情况下乘以 -1 来支持,但是只有 Preon 实际上支持某种算术,这才有可能。

映射基本如下:

// ok
@BoundString(size = "1")
private String start;

// ??
@BoundNumber(size = "8")
private short size;

// ok
@BoundNumber(size = "8")
private short header;

// ok
@BoundNumber(size = "56", byteOrder = ByteOrder.BigEndian)
private long imei;

// ok
@BoundNumber(size = "8")
private short mask;

// ok
@BoundNumber(size = "5", byteOrder = ByteOrder.BigEndian)
private short day;

// ok
@BoundNumber(size = "4", byteOrder = ByteOrder.BigEndian)
private short month;

// ok
@BoundNumber(size = "5", byteOrder = ByteOrder.BigEndian)
private short year;

// ok
@BoundNumber(size = "5", byteOrder = ByteOrder.BigEndian)
private short hour;

// ok
@BoundNumber(size = "6", byteOrder = ByteOrder.BigEndian)
private short minute;

// ok
@BoundNumber(size = "6", byteOrder = ByteOrder.BigEndian)
private short second;

@Bound
private boolean latPositive;

@BoundNumber(size = "27", byteOrder = ByteOrder.BigEndian)
private int lat;

@Bound
private boolean lngPositive;

@BoundNumber(size = "28", byteOrder = ByteOrder.BigEndian)
private int lng;

// ok
@BoundNumber(size = "8", byteOrder = ByteOrder.BigEndian)
private int speed;

@BoundNumber(size = "7", byteOrder = ByteOrder.BigEndian)
private int direction;

// ok
@Bound
private boolean gpsFix;

// ok
@BoundNumber(size = "13", byteOrder = ByteOrder.BigEndian)
private int altitude;

// ok
@BoundNumber(size = "20", byteOrder = ByteOrder.BigEndian)
private int odometer;

// ok
@BoundNumber(size = "8", byteOrder = ByteOrder.BigEndian)
private int batteryLevel;

PS:是否有可用的 Preon 用户邮件列表?

最佳答案

这可能为时已晚,但我最近一直在深入研究 preon,所以我在 preon 中看到的似乎有两种可能性:

a) 使用@Init注释指定要在代码中完成的转换,例如

public static class Blah {
    @BoundNumber(size="32", byteOrder = ByteOrder.BigEndian)
    private int size;

    @Init
    public void go() {
        size = size * 3;
    }
}

b) 创建一个 CodecDecorator(我会复制类似 InitCodecDecorator 的内容来启动),它了解如何执行算术、添加正确的注释并将其添加到解码器,如下所示: http://technofovea.com/blog/archives/850

或者简单地添加理解二进制契约的 getter 和 setter;

关于java - 使用 Preon 框架进行简单算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27987687/

相关文章:

api - 如何解码事物的 Steam 图像网址?

math - 批处理文件中是否存在 "Power to"函数? (指数)

python - 如何从python中的随机分布中找到指数曲线(和曲线)下的面积?

java - TIFF 5.0 风格的 LZW 压缩有什么特别之处

java - 在java中使用循环将递归方法转换为非递归方法

kotlin - 具有给定精度的Pi的Leibniz公式

Python3 - 无法读取 docx、odt 文件 - UnicodeDecodeError : 'utf-8' codec can't decode byte 0xea in position 10: invalid continuation byte

升级到 Spark 1.3.0 时出现 JAVA_HOME 错误

java - 项目文件管理

java - PDF 解析器文本包含