Question

J'avais posé une question sur la conversion des champs de COMP, pour que je ne l'ai pas eu de réponse.

J'espère que la pile débordement peut me aider sur cette question.

I a réussi à convertir COMP-3 en décimal. J'ai besoin de votre aide pour convertir le dos décimal décompressé à COMP-3, dans un langage de programmation de haut niveau, mais de préférence en Java ou .net c #.

Était-ce utile?

La solution

-123 décimal condensé est représenté comme X'123d »(la dernière nyble c, d ou f étant le signe). L'une des façons les plus simples à manipuler décimal emballé est de convertir simplement les octets à une chaîne hexagonale (ou vice versa selon le cas) puis utiliser la manipulation de chaînes normales. Cela peut ne pas être le plus efficace, mais il est facile à mettre en œuvre.

Donc, pour convertir un entier (valeur) à peu près décimale empotés (note: Je ne l'ai pas testé le code)

String sign = "c";
if (value < 0) {
    sign = "d";
    value = -1 * value;
}
String val = value + "d"

byte[] comp3Bytes = new BigInteger(val, 16).toByteArray();

Voici quelques-uns des exemples de code pour la conversion vers / de COMP3 Pour récupérer un nombre décimal emballé à partir d'un tableau d'octets voir méthode getMainframePackedDecimal dans http://record-editor.svn.sourceforge.net/viewvc/record-editor/Source/JRecord/src/net/sf/JRecord/Common/Conversion.java?revision=3&view=markup

et définir une décimale voir emballé setField dans http://record-editor.svn.sourceforge.net/viewvc/record-editor/Source/JRecord/src/net/sf/JRecord/Types/TypePackedDecimal.java?revision=3&view=markup

les deux routines prendre un tableau d'octets, une position de début et une longueur, soit d'une position sur le terrain.

Il existe d'autres exemples de le faire sur le web (JRanch Je pense que le code a pour faire la conversion ainsi), faire un peu de googler.

Autres conseils

Conversion zoné décimal à comp-3 est assez facile -. Dégagez les amuse-gueules de l'octet bas et bande large de la demi-octet de tous les autres octets

Considérons le nombre 12.345 - en notation décimale condensée, qui serait un x'12345C 'ou x'12345F' (à la fois C et F sont +, A B et D sont -). Lorsque vous avez converti à zoné décimal, vous le bit de poids faible retourné et a inséré un « F » dans le bit de poids fort entre chaque chiffre. Transformer en x'F1F2F3F4C5' .

Pour reconvertir, vous inversez tout le processus. En utilisant java, qui ressemblerait à ceci:

byte[] myDecimal = { 0xF1, 0xF2, 0xF3, 0xF4, 0xF5 };
byte[] myPacked = new byte[3];

//Even low nibble moved to high nibble and merged with odd low nibble
myPacked[0] = ((myDecimal[0] & 0b00001111)  << 4)) | (myDecimal[1] & 0b00001111);
myPacked[1] = ((myDecimal[2] & 0b00001111)  << 4)) | (myDecimal[3] & 0b00001111);

//Last byte gets filpped for sign
myPacked[2] = ((myDecimal[5] & 0b00001111)  << 4)) | (myDecimal[4] & 0b00001111);

Quand j'ai sali avec COMP-3 dans le passé avec Java je fini par écrire une méthode de lecture dans les octets et les convertir en nombre. Je ne pense pas que je jamais eu à écrire COMP-3, mais je suppose que j'utiliser en sens inverse la même logique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top