java – Kaitai Struct:传递一些字段来实现容错
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Kaitai Struct:传递一些字段来实现容错,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3546字,纯文字阅读大概需要6分钟。
内容图文
![java – Kaitai Struct:传递一些字段来实现容错](/upload/InfoBanner/zyjiaocheng/788/05fc04fd4b6a4f7bae6fa4d3738c3c87.jpg)
在解析Kaitai Struct中的截断日志时,有没有办法传递一些字段?
因为如果它读取一个字段(类型指定为枚举)但值不在那里,它将引发NullPointer异常.
所以我想问一下是否有任何方法可以像默认一样实现:在python库Construct中传递属性
这是我的ksy文件:
meta:
id: btsnoop
endian: be
seq:
- id: header
type: header
- id: packets
type: packet
repeat: eos
types:
header:
seq:
- id: iden
size: 8
- id: version
type: u4
- id: datalink_type
type: u4
enum: linktype
packet:
seq:
- id: ori_len
type: u4
- id: include_len
type: u4
- id: pkt_flags
type: u4
- id: cumu_drop
type: u4
- id: timestamp
type: s8
- id: data
size: include_len
type: frame
frame:
seq:
- id: pkt_type
type: u1
enum: pkttype
- id: cmd
type: cmd
if: pkt_type == pkttype::cmd_pkt
- id: acl
type: acl
if: pkt_type == pkttype::acl_pkt
- id: evt
type: evt
if: pkt_type == pkttype::evt_pkt
cmd:
seq:
- id: opcode
type: u2le
- id: params_len
type: u1
- id: params
size: params_len
acl:
seq:
- id: handle
type: u2le
evt:
seq:
- id: status
type: u1
enum: status
- id: total_length
type: u1
- id: params
size-eos: true
enums: <-- I need to list all possible option in every enum?
linktype:
0x03E9: unencapsulated_hci
0x03EA: hci_uart
0x03EB: hci_bscp
0x03EC: hci_serial
pkttype:
1: cmd_pkt
2: acl_pkt
4: evt_pkt
status:
0x0D: complete_D
0x0E: complete_E
0xFF: vendor_specific
谢谢你的答复 :)
解决方法:
你在这里还有两个问题:)
解析部分/截断/损坏的数据
这里的主要问题是通常Kaitai Struct将.ksy编译成一个代码,该代码在类构造函数中进行实际的解析.这意味着如果出现问题,繁荣,你根本没有任何对象.在大多数用例中,它是理想的行为,因为它实际上允许您确保对象已完全初始化.问题通常是EOFException,当格式想要读取下一个原语时,但是流中没有数据,或者在一些更复杂的情况下,还有其他东西.
但是,正如您所提到的那样,有一些用例,其中“尽力而为”解析会有所帮助 – 即您可以使用半满的对象.另一个流行的用例是可视化器:它也有助于显示“尽力而为”,因为最好显示用户半解析结果可视化(以帮助定位错误)而不是根本没有结果(并留下用户猜测).
在Kaitai Struct中有一个简单的解决方案 – 您可以使用–debug选项编译您的类.通过这种方式,您将获得一个将对象创建和解析分开的类,解析将只是对象的另一种方法(void _read()).但是,这意味着您必须手动调用解析方法.例如,如果您的原始代码是:
Btssnoop b = Btssnoop.fromFile("/path/to/file.bin");
System.out.println(b.packets.size());
在用–debug编译之后,你将不得不做额外的步骤:
Btssnoop b = Btssnoop.fromFile("/path/to/file.bin");
b._read();
System.out.println(b.packets.size());
然后你可以将它包装在try / catch块中,并在获得IOException后实际继续处理:
Btssnoop b = Btssnoop.fromFile("/path/to/file.bin");
try {
b._read();
} catch (IOException e) {
System.out.println("warning: truncated packets");
}
System.out.println(b.packets.size());
但有几个渔获量:
> –devug尚未提供Java目标,截至发行版v0.3;实际上,它现在甚至不在公共git存储库中,我希望尽快推出它.
> –debug还做了一些额外的事情,比如写下每个属性的位置,这会造成相当严厉的性能/内存损失.告诉我你是否需要一个开关来编译“单独的构造函数/解析”功能,而没有其余的–debug功能 – 我可以想到额外的开关来启用它.
>如果您需要在传入数据包到达时对其进行连续解析,可能将它们全部存储在内存中并在每次更新时重新解析它们都是一个坏主意.我们正在考虑基于事件的解析模型,请告诉我你是否对那个感兴趣.
缺少枚举值和NPE
当前的Java实现将枚举读取转换成类似的东西
this.pet1 = Animal.byId(_io.readU4le());
其中Animal.byId被翻译成:
private static final Map<Long, Animal> byId = new HashMap<Long, Animal>(3);
static {
for (Animal e : Animal.values())
byId.put(e.id(), e);
}
public static Animal byId(long id) { return byId.get(id); }
当地图中未找到任何值时,Java Map的get按合约返回null.您应该能够将null与某些内容(即其他枚举值)进行比较,并获得正确的true或false.你能告诉我你究竟有NPE问题的地方,即你的代码,生成的代码和堆栈跟踪吗?
内容总结
以上是互联网集市为您收集整理的java – Kaitai Struct:传递一些字段来实现容错全部内容,希望文章能够帮你解决java – Kaitai Struct:传递一些字段来实现容错所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。