Comment convertir le nombre décimal décompressé en COMP-3?

J’avais posé une question sur la conversion des champs COMP, pour laquelle je n’ai reçu aucune réponse.

J’espère que le dépassement de capacité peut m’aider sur cette question.

J’ai réussi à convertir COMP-3 en décimal. J’ai besoin de votre aide pour reconvertir le décimal décompressé en COMP-3, dans n’importe quel langage de programmation de haut niveau, mais de préférence en Java ou en c # .net.

En décimal condensé, -123 est représenté par X’123d ‘(le dernier nyble c, d ou f étant le signe). L’un des moyens les plus simples de gérer une décimale condensée consiste à convertir simplement les octets en chaîne hexadécimale (ou inversement selon les besoins), puis à utiliser une manipulation de chaîne normale. Ce n’est peut-être pas le plus efficace, mais il est facile à mettre en œuvre.

Donc, convertir un entier (valeur) en décimal condensé est à peu près (note: je n’ai pas testé le code)

Ssortingng sign = "c"; if (value < 0) { sign = "d"; value = -1 * value; } String val = value + "d" byte[] comp3Bytes = new BigInteger(val, 16).toByteArray(); 

Vous trouverez ci-dessous un exemple de code pour la conversion vers / depuis comp3. Pour récupérer une décimale condensée à partir d'un tableau d'octets, voir la 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 pour définir une décimale condensée, voir setField dans http://record-editor.svn.sourceforge.net/viewvc/record-editor/Source/JRecord/src/net/sf/JRecord/Types/TypePackedDecimal.java?revision=3&view = balisage

les deux routines prennent un tableau d'octets, une position de départ et la longueur d'une position de champ.

Il existe d’autres exemples de ce type d’utilisation sur le Web (JRanch, je pense, dispose également d’un code permettant d’effectuer la conversion), par exemple, un peu de recherche sur Google.

La conversion de décimales zonées en comp-3 est assez facile – retournez les octets bas et lâchez tous les autres octets.

Considérons le nombre 12345 – en notation décimale empaquetée, qui serait un x’12345C ‘ou un x’12345F’ (C et F sont tous deux +, AB et D sont -). Lorsque vous l’avez converti en virgule décimale, vous avez retourné le petit quartet et inséré un “F” dans le haut entre chaque chiffre. En le transformant en x’F1F2F3F4C5 ‘.

Pour le reconvertir, il suffit d’inverser le processus. En utilisant java, cela ressemblerait à:

 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 déjà eu affaire à COMP-3 avec Java, j’ai fini par écrire une méthode pour lire les octets et les convertir en nombre. Je ne pense pas avoir jamais eu à écrire COMP-3, mais je suppose que j’utiliserais la même logique à l’envers.