通过java套接字接收asn.1消息

通过java套接字接收asn.1消息,java,asn.1,Java,Asn.1,我正在使用BinaryNotes对我的ASN.1消息进行编码和解码,我的类是使用bnotes编译器编译的。我在这里使用pdf中包含的编码/解码示例: 第11页 下面是示例代码: // Encoding for Java TestSequence sequence = new TestSequence(); sequence.setField1(10L); sequence.setField3("Hello"); // Inner class for implicitly ASN.1 type d

我正在使用BinaryNotes对我的ASN.1消息进行编码和解码,我的类是使用bnotes编译器编译的。我在这里使用pdf中包含的编码/解码示例:

第11页

下面是示例代码:

// Encoding for Java
TestSequence sequence = new TestSequence();
sequence.setField1(10L);
sequence.setField3("Hello");
// Inner class for implicitly ASN.1 type declaration
TestSequence.Field4ChoiceType choice = sequence.new Field4ChoiceType();
choice.selectField2(0.5);
sequence.setField4(choice);
IEncoder< TestSequence> encoder=CoderFactory.getInstance).newEncoder("BER");
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
encoder.encode(sequence, outputStream);`

如果我以ByteArrayInputStream的形式接收数据,我如何确定要传递给decoder.decode方法的类名?

您必须知道接收到的数据类型,因此必须知道类名。如果您正在实现asn.1,什么是适当的方法来传达?我预计会有某种类型的标记与消息一起编码。如果您想要标记编码的消息,您必须在DER编码中使用ASN.1消息。对于BER编码的消息,您必须知道一切,接下来是什么消息以及消息具有什么结构,对于DER编码的消息,结构包含在数据中。当然,BER编码的信息要比DER编码的信息小得多…@Robert,我想你在这种情况下把PER和BER混淆了。PER是位压缩的,并通知模式;BER是DER的适当超集(事实上,任何DER编码的消息都可以由BER解码器解码)。我不熟悉BinaryNotes,但StormLord认为标签有助于识别邮件类型是正确的。感谢所有回复。我可以从ber更改为der,但我没有发现包含类名。当查看第8节下的规范时,它显示了标识符八位字节,我预计这将特定于“TestSequence”,但我得到的是bytearray的第一个八位字节0x30,这只是普通序列。你必须知道你收到的数据类型,因此你必须知道类名。如果你正在实现asn.1,什么是合适的方法来传达这些信息?我预计会有某种类型的标记与消息一起编码。如果您想要标记编码的消息,您必须在DER编码中使用ASN.1消息。对于BER编码的消息,您必须知道一切,接下来是什么消息以及消息具有什么结构,对于DER编码的消息,结构包含在数据中。当然,BER编码的信息要比DER编码的信息小得多…@Robert,我想你在这种情况下把PER和BER混淆了。PER是位压缩的,并通知模式;BER是DER的适当超集(事实上,任何DER编码的消息都可以由BER解码器解码)。我不熟悉BinaryNotes,但StormLord认为标签有助于识别邮件类型是正确的。感谢所有回复。我可以从ber更改为der,但我没有发现包含类名。当查看第8节下的规范时,它显示了标识符八位字节,我预计这将特定于“TestSequence”,但我得到的是bytearray的第一个八位字节0x30,这只是普通序列。
// Decoding for Java
IDecoder decoder = CoderFactory.getInstance().newDecoder("BER");
// Decoding the specified input stream
TestSequence seq = decoder.decode(stream, TestSequence.class);
System.out.println(seq.getField1());
if(seq.isField3Present())
System.out.println(seq.getField3());