使用 Preon 框架的简单算法
Simple arithmetic using Preon framework
我正在使用 Preon Binding 读取传入的二进制数据流。
我们遇到的问题是某些字段值需要一些简单的算法才能正确表示,正如我们的 "data documentation" 所说:
- field lat:来自设备坐标的纬度分量。二进制
格式纬度必须除以 1.000.000
- 磁场方向:设备的方位角除以 3
Preon 是否可以在绑定时支持此类算法,或者我是否必须在解码后专门执行此操作(这会导致解码后的 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;
我正在使用 Preon Binding 读取传入的二进制数据流。
我们遇到的问题是某些字段值需要一些简单的算法才能正确表示,正如我们的 "data documentation" 所说:
- field lat:来自设备坐标的纬度分量。二进制 格式纬度必须除以 1.000.000
- 磁场方向:设备的方位角除以 3
Preon 是否可以在绑定时支持此类算法,或者我是否必须在解码后专门执行此操作(这会导致解码后的 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;