2010-12-02 80 views
3

J'avais posé une question sur la conversion des champs COMP, pour laquelle je n'ai pas eu de réponse.Comment convertir une décimale décompactée en COMP-3?

J'espère que le débordement de pile peut m'aider sur cette question.

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

+0

Ummm ... Si vous réussissez à convertir COMP-3 en décimal, qu'est-ce qui vous empêche d'inverser le processus pour une conversion décimale en COMP-3? – NealB

+1

Pourquoi est-ce difficile? Prenez les 4 bits inférieurs des chiffres non-signés, mettez-les ensemble avec des décalages et des opérations au niveau des bits, et fixez l'indicateur de signe approprié à la fin. Prends un coup de couteau, alors si tu as des problèmes, reviens ici et pose-toi des questions à leur sujet. Ou écrivez-le en ASCII ou EBCDIC et écrivez le traducteur en COBOL. –

+0

@David, pouvez-vous mettre plus de lumière sur l'écriture d'un traducteur COBOL? Parce que mon code sera en. NET et si possible pouvez-vous me donner les détails de la conversion de la sortie en format EBCDIC? –

Répondre

3

en décimal -123 tassée est représentée comme X'123d »(la dernière nyble c, d ou f étant le signe). L'un des moyens les plus simples de gérer les décimales condensées est de simplement convertir les octets en une chaîne hexadécimale (ou vice versa selon les besoins), puis d'utiliser la manipulation normale des chaînes. Ce n'est peut-être pas le plus efficace mais il est facile à mettre en œuvre.

Donc, pour convertir un entier (valeur) en décimal emballé est à peu prè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 exemples de code pour convertir à/de comp3 Pour récupérer une salle comble décimal à 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 pour définir un décimal condensé voir 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 prennent un tableau d'octets, une position de départ et soit une longueur d'une position de champ.

Il y a d'autres exemples de faire cela sur le web (JRanch je pense avoir du code pour faire la conversion aussi), faire un peu de googling.

+0

Merci beaucoup. –

0

Lorsque je me suis trompé avec COMP-3 dans le passé avec Java, j'ai fini par écrire une méthode pour lire dans 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 en sens inverse.

+0

ce serait génial si vous pouviez me le donner. –

+0

Je vous serai très reconnaissant. –

+0

@Krishna: Je n'ai pas le code à portée de main pour le moment et je l'aurais peut-être jeté quand ce n'était plus nécessaire. Je pense que je viens de lire les définitions pour comp-3 et déterminé comment organiser les amuse-gueules. – jzd

2

La conversion d'une décimale zonée en comp-3 est assez simple: inversez les grignotements de l'octet faible et supprimez le grignotement élevé de tous les autres octets. Considérons le numéro 12345 - en notation décimale condensée, qui serait un x'12345C 'ou x'12345F' (les deux C et F sont +, A B et D sont -). Lorsque vous l'avez converti en décimal zoné, vous avez inversé le grignotage bas et inséré un "F" dans le grignotement haut entre chaque chiffre. En le transformant en x'F1F2F3F4C5 '.

Pour le reconvertir, il vous suffit d'inverser 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);