- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Preon解析二进制文件,这些文件被构造为一系列可变长度记录。对于每条记录,都有一个数字指定记录长度(以字节为单位)。
这是我正在尝试做的事情的简化版本:
package test.preon;
import nl.flotsam.preon.annotation.BoundList;
import nl.flotsam.preon.annotation.BoundNumber;
import java.util.List;
public class BinFile {
@BoundNumber(size="16") int numberOfRecords;
@BoundList(type=Record.class, size="numberOfRecords") List<Record> records;
public int getNumberOfRecords() {
return numberOfRecords;
}
public List<Record> getRecords() {
return records;
}
public class Record {
@BoundNumber(size="16") int recordLength;
@BoundList(size="recordLength") byte[] data;
public int getRecordLength() {
return recordLength;
}
public byte[] getData() {
return data;
}
}
}
因此,numberOfRecords 指定文件中的记录数,recordLength 指定每个记录的长度。问题是 Preon 无法解析 Record 中的 recordLength,尽管 numberOfRecords 在 BinFile 中工作正常。
这是我得到的异常:
nl.flotsam.limbo.BindingException: Failed to resolve recordLength on class test.preon.BinFile
at nl.flotsam.preon.codec.BindingsContext$BindingsResolver.get(BindingsContext.java:412)
at nl.flotsam.preon.codec.BindingsContext$BindingReference.resolve(BindingsContext.java:247)
at nl.flotsam.preon.codec.BindingsContext$BindingReference.resolve(BindingsContext.java:189)
at nl.flotsam.limbo.ast.ReferenceNode.eval(ReferenceNode.java:57)
at nl.flotsam.limbo.ast.ArithmeticNode$Operator$5.eval(ArithmeticNode.java:109)
at nl.flotsam.limbo.ast.ArithmeticNode.eval(ArithmeticNode.java:250)
at nl.flotsam.limbo.ast.ArithmeticNode.eval(ArithmeticNode.java:33)
at nl.flotsam.limbo.ast.ArithmeticNode$Operator$3.eval(ArithmeticNode.java:83)
at nl.flotsam.limbo.ast.ArithmeticNode.eval(ArithmeticNode.java:250)
at nl.flotsam.limbo.ast.ArithmeticNode.eval(ArithmeticNode.java:33)
at nl.flotsam.limbo.ast.ArithmeticNode$Operator$5.eval(ArithmeticNode.java:109)
at nl.flotsam.limbo.ast.ArithmeticNode.eval(ArithmeticNode.java:250)
at nl.flotsam.limbo.ast.ArithmeticNode.eval(ArithmeticNode.java:33)
at nl.flotsam.preon.codec.ListCodecFactory$SwitchingListCodec.decode(ListCodecFactory.java:458)
at nl.flotsam.preon.codec.ListCodecFactory$SwitchingListCodec.decode(ListCodecFactory.java:443)
at nl.flotsam.preon.binding.StandardBindingFactory$FieldBinding.load(StandardBindingFactory.java:128)
at nl.flotsam.preon.codec.ObjectCodecFactory$ObjectCodec.decode(ObjectCodecFactory.java:251)
at nl.flotsam.preon.DefaultCodecFactory$DefaultCodec.decode(DefaultCodecFactory.java:173)
at nl.flotsam.preon.Codecs.decode(Codecs.java:218)
at nl.flotsam.preon.Codecs.decode(Codecs.java:199)
...
如果我将 size="recordLength"更改为常量,例如size="42",我没有得到异常(exception)(但是当然,记录长度必须始终相同)。
是否有其他方法可以使记录长度可变,或者我应该以不同的方式组织事物?
如果有人感兴趣,这是我使用过的 JUnit 测试:
package test.preon;
import org.junit.Test;
import static org.junit.Assert.*;
import nl.flotsam.preon.Codecs;
import nl.flotsam.preon.Codec;
import nl.flotsam.preon.DecodingException;
import test.preon.BinFile;
import test.preon.BinFile.Record;
import java.util.List;
public class BinFileTest {
@Test
public void parseBinFile() throws DecodingException {
Codec<BinFile> codec = Codecs.create(BinFile.class);
byte[] buffer = new byte[] {
2, 0,
3, 0,
'a', 'b', 'c',
4, 0,
'1', '2', '3', '4'
};
BinFile b = Codecs.decode(codec, buffer);
assertEquals(b.getNumberOfRecords(), 2);
List<Record> rL = b.getRecords();
assertEquals(rL.size(), 2);
Record r0 = rL.get(0);
assertEquals(r0.getRecordLength(), 3);
assertEquals(new String(r0.getData()), "abc");
Record r1 = rL.get(1);
assertEquals(r1.getRecordLength(), 4);
assertEquals(new String(r1.getData()), "1234");
}
}
最佳答案
原来你遇到了一个错误。 ListCodecFactory 有一个策略来决定在各种情况下生成哪种类型的编解码器,但事实证明在这种情况下它选择了错误的编解码器。我有这个补丁,如果你有兴趣的话我可以发给你。
关于java - 在 Preon 中解析可变记录长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2362412/
根据http://www.scribd.com/doc/8128172/Preon-Introduction ,Preon 可用于将位解码为枚举表示形式,如下所示: // Reads a bit fr
我想使用Preon用于与用 C 编写的服务器进行通信的项目。该协议(protocol)取决于机器的 native 字节序(假设 JVM 与服务器具有相同的字节序,可以用此 java.nio.ByteO
我正在尝试安装 preon 并在 IntelliJ 中运行它。 我已经从https://github.com/preon/preon下载了源代码。 然后我用 IntelliJ 打开该项目。 然后我下载
我正在尝试使用 Preon解析二进制文件,这些文件被构造为一系列可变长度记录。对于每条记录,都有一个数字指定记录长度(以字节为单位)。 这是我正在尝试做的事情的简化版本: package test.p
我尝试使用 Preon 解码的二进制流的值由 5 个不连续的半字节组成,例如: 十六进制数据:00A00000F200EE0000 考虑到该值必须从非零标记的半字节中提取到 AF2EE 中,使用 Pr
我正在使用 Preon Binding 来读取传入的二进制数据流。 我们遇到的问题是某些字段值需要一些简单的算术才能正确表示,正如我们的“数据文档”所述: 字段 lat:设备坐标的纬度分量。二进制形式
背景 我正在尝试使用 preon用于编码/解码二进制数据的库。当我为大端配置字节顺序时,我的 1 字节结构工作正常,但为小端则失败。看来字节序会影响前子中的字节内数据。出现this问题涉及同一问题,但
我尝试在 Android 2.1 上运行示例 Preon 应用程序,但没有成功。我想知道是否可以在 Android 上运行 Preon 应用程序。让 Preon 框架 Dalvik 变得友好有多难?
Preon是一个用于创建二进制编解码器的 Java 库:您只需在类的数据成员中放置关于它们与位字段的对应关系的注释(例如,用于特定字段的位数),并且基于此类,该库构建一个 Codec 对象能够创建类的
我是一名优秀的程序员,十分优秀!