Frage

hatte ich eine Frage über das Konvertieren von COMP Feldern gefragt, für die ich keine Antwort bekommen hätte.

Ich hoffe, Stack-Überlauf mir zu dieser Frage helfen kann.

Es gelang mir, bei der Umwandlung von COMP-3 in Dezimalzahlen. Ich brauche Ihre Hilfe in die entpackte Dezimalzahl zurück zu COMP-3, das in einer höheren Programmiersprache konvertieren, aber vorzugsweise in Java oder C # .NET.

War es hilfreich?

Lösung

in gepackten dezimalen -123 als X'123d‘(die letzten nyble c, d oder f ist das Vorzeichen) dargestellt. Eine der einfachsten Möglichkeiten, gepackte Dezimalzahl zu handhaben ist, einfach die Bytes zu konvertieren auf einen Hex-String (oder je nach Bedarf umgekehrt), dann normale Fadenmanipulation verwenden. Dies kann nicht die effizienteste, aber es ist einfach zu implementieren.

So einen Integer (Wert) auf gepackten Dezimalzahl zu konvertieren ist grob (Anmerkung: Ich habe den Code nicht getestet)

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

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

Im Folgenden sind einige Beispiel-Code für von comp3 zu / Umwandeln Zum Abrufen sehen eine gepackte dezimale aus einem Array von Bytes Verfahren getMainframePackedDecimal in http://record-editor.svn.sourceforge.net/viewvc/record-editor/Source/JRecord/src/net/sf/JRecord/Common/Conversion.java?revision=3&view=markup

und eine gepackte Dezimalzahl siehe einzustellen setField in http://record-editor.svn.sourceforge.net/viewvc/record-editor/Source/JRecord/src/net/sf/JRecord/Types/TypePackedDecimal.java?revision=3&view=markup

beide Routinen nehmen ein Array von Bytes, die eine Startposition und entweder eine Länge einer Feldposition.

Es gibt andere Beispiele, dies zu tun, die im Internet (JRanch Ich denke Code hat auch die Konvertierung zu tun), tut ein bisschen googeln.

Andere Tipps

Umwandlung in Zonen aufgeteilten Dezimalzahl in comp-3 ganz einfach ist -. Die Knabbereien des Low-Bytes Flip und das hohe Nibble aller anderen Bytes abzustreifen

Betrachten Sie die Nummer 12345 - in gepackte Dezimaldarstellung, die ein x'12345C 'oder x'12345F' sein würde (beide C und F +, A B und D -). Wenn Sie es umgewandelt in Zonen aufgeteilten dezimal, blätterte Sie die Low-Nibble und eingefügt jeder Ziffer ein „F“ in der High-Nibble zwischen. Durch Drehen in x'F1F2F3F4C5' .

Um es zurück zu konvertieren, müssen Sie nur den umzukehren. Verwendung von Java, das würde wie folgt aussehen:

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);

Wenn ich mit COMP-3 in der Vergangenheit mit Java ich eine Methode Schreiben endete messed haben sich in den Bytes zu lesen und sie in eine Zahl umwandeln. Ich glaube nicht, dass ich jemals zu schreiben COMP-3 habe, aber ich nehme an, ich würde die gleiche Logik umgekehrt verwendet werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top