Asn1API
Voir les Release Notes pour les dernières évolutions.
Une Asn1API est une librairie contenant tout le matériel nécessaire à l'encodage et au décodage de données respectant un schéma ASN.1/XML. Elles sont disponibles en Java et C#.
Contenu de la librairie Asn1API
Une librairie Asn1API comprend :
- le guide d'utilisation décrit les packages et namespaces, détaille les méthodes d'accès aux classes Java ou C# ainsi que les procédures de codage/décodage ;
- les classes Java ou C# issues du schéma ASN.1/XML. Elles sont produites par Asn1Compiler ;
- la documentation des classes au format javadoc ou MSDN-style HTML Help ;
- la librairie runtime de codage/décodage ;
- des exemples d'utilisation.
Le runtime
Le runtime est une librairie pure Java ou C#. Il regroupe les primitives d'encodage et de décodage des types de base.
Les règles d'encodage supportées par le runtime sont :
- Spécification des règles de codage de base (BER/DER, UIT-T X.690 / ISO/CEI 8825-1)
- Spécification des règles de codage compact (PER, UIT-T X.691 / ISO/CEI 8825-2)
- Spécification des règles de codage XML (Basic XER/Canonical XER/Extended XER, UIT-T X.693 + Amendement-1 / ISO/8825-4)
Le runtime offre de nombreuses caractéristiques parmi lesquelles :
- la possiblité de changer de règles d'encodage en changeant d'instance de decodeur/encodeur ;
- la fourniture d'un diagnostic d'erreur compréhensible ;
- le support de la "sérialisation" ;
- le support pour les fonctions clone/equals/hashcode/toString.
Un exemple
Voici un exemple Java et C# d'utilisation d'API générée à partir du fichier sample.asn1 :
SampleModule
DEFINITIONS AUTOMATIC TAGS ::= BEGIN MainStruct ::= SEQUENCE { name IA5String, age INTEGER } END
Utilisation Java
Les fichiers générés principaux sont :
- Sample/src/java/Sample/SampleFactory.java
- Sample/src/java/samplemodule/MainStruct.java
SampleFactory est une classe qui permet la gestion de l'API notamment la création des encodeurs et décodeurs. MainStruct est la classe associée au type ASN.1 MainStruct. Elle contient notamment les méthodes set/get pour accéder aux valeurs des composantes "name" et "age". Un exemple d'utilisation est :
import com.unigone.asn1RT.IDecoder;
import com.unigone.asn1RT.IEncoder;
import com.unigone.asn1RT.Asn1Exception;
import com.unigone.asn1RT.util.ByteArray;
import Sample.*;
import Sample.samplemodule.*;
...
/* encoder/decoder creation */
_encoder = SampleFactory.createEncoder();
_decoder = SampleFactory.createDecoder();
// fill a value
MainStruct mainStruct = new MainStruct();
mainStruct.setName("ABC");
mainStruct.setAge(7);
try
{
// ensure type is valid before encoding it
mainStruct.validate();
// Encode data (it could be written directly into a stream)
_encoder.encode(mainStruct);
}
catch (Asn1ValidationException avex)
{
System.out.println("ERROR WHILE VALIDATING pdu : "
+ avex.getMessage());
return;
}
catch (Asn1Exception aex)
{
System.out.println("ERROR WHILE ENCODING pdu : "
+ aex.getMessage());
return;
}
// dump data
System.out.println("mainStruct encoding :");
byte[] mainStruct_encoding = _encoder.getData();
System.out.println(ByteArray.byteArrayToHexString(mainStruct_encoding, null, -1));
// decode an encoding
mainStruct = new MainStruct();
try
{
// Decode data (it could be read directly from a stream).
_decoder.decode(mainStruct_encoding, mainStruct);
// ensure type is valid
mainStruct.validate();
}
catch (Asn1ValidationException avex)
{
// display already decoded values...
System.out.println(mainStruct.toString());
System.out.println("ERROR WHILE VALIDATING pdu : "
+ ex.getMessage());
return;
}
catch (Asn1Exception aex)
{
// display already decoded values...
System.out.println(mainStruct.toString());
System.out.println("decoder stopped at "+_decoder.usedBytes());
System.out.println("ERROR WHILE DECODING pdu : "
+ aex.getMessage());
return;
}
// access the value
String _name = mainStruct.getName();
long _age = mainStruct.getAge();
// using toString() with mainStruct
System.out.println(mainStruct.toString());
Utilisation C#
Les fichiers générés principaux sont :
- Sample/src/cSharp/Sample/SampleFactory.cs
- Sample/src/cSharp/SampleModule/MainStruct.cs
SampleFactory est une classe qui permet la gestion de l'Asn1API notamment la création des encodeurs et décodeurs. MainStruct est la classe associée au type ASN.1 MainStruct. Elle contient notamment les properties C# pour accéder aux valeurs des composantes "name" et "age". Un exemple d'utilisation est :
using IEncoder = Unigone.Asn1RT.IEncoder;
using IDecoder = Unigone.Asn1RT.IDecoder;
using Asn1Exception = Unigone.Asn1RT.Asn1Exception;
using ByteArray = Unigone.Asn1RT.Util.ByteArray;
using Sample;
using Sample.SampleModule;
...
/* encoder/decoder creation */
_encoder = SampleFactory.CreateEncoder();
_decoder = SampleFactory.CreateDecoder();
// fill a value
MainStruct mainStruct = new MainStruct();
mainStruct.Name = "ABC";
mainStruct.Age = 7;
try
{
// ensure type is valid before encoding it
mainStruct.Validate();
// Encode data (it could be written directly into a stream)
_encoder.Encode(mainStruct);
}
catch (Asn1ValidationException avex)
{
Console.Out.WriteLine("ERROR WHILE VALIDATING pdu : "
+ avex.Message);
return;
}
catch (Asn1Exception aex)
{
Console.Out.WriteLine("ERROR WHILE ENCODING pdu : "
+ aex.Message);
return;
}
// dump data
Console.Out.WriteLine("mainStruct encoding :");
byte[] mainStruct_encoding = _encoder.Data;
Console.Out.WriteLine(ByteArray.ByteArrayToHexString(mainStruct_encoding, null, -1));
// decode an encoding
mainStruct = new MainStruct();
try
{
// Decode data (it could be read directly from a stream).
_decoder.Decode(mainStruct_encoding, mainStruct);
// ensure type is valid
mainStruct.Validate();
}
catch (Asn1ValidationException avex)
{
// display already decoded values...
Console.Out.WriteLine(mainStruct.ToString());
Console.Out.WriteLine("ERROR WHILE VALIDATING pdu : "
+ avex.Message);
return;
}
catch (Asn1Exception aex)
{
// display already decoded values...
Console.Out.WriteLine(mainStruct.ToString());
Console.Out.WriteLine("decoder stopped at "+_decoder.UsedBytes());
Console.Out.WriteLine("ERROR WHILE DECODING pdu : "
+ aex.Message);
return;
}
// access the value
string _name = mainStruct.Name;
long _age = mainStruct.Age;
// using ToString() with mainStruct
Console.Out.WriteLine(mainStruct.ToString());
