Domanda

I aveva fatto una domanda sulla conversione di campi COMP, per cui non ho avuto alcuna risposta.

spero di stack overflow mi può aiutare su questa questione.

I riuscì a convertire COMP-3 al decimale. Ho bisogno del vostro aiuto nella conversione di parte posteriore decimale scompattato a COMP-3, in qualsiasi linguaggio di programmazione di alto livello, ma preferibilmente in Java o C # .NET.

È stato utile?

Soluzione

In decimale compresso -123 è rappresentato come X'123d'(l'ultimo nyble C, D o F è il segno). Uno dei modi più semplici per gestire decimale imballato è quello di convertire semplicemente i byte una stringa esadecimale (o viceversa, come richiesto) utilizzare normale manipolazione delle stringhe. Questo potrebbe non essere il più efficiente, ma è facile da implementare.

Quindi, per convertire un numero intero (valore) per decimale compresso è approssimativamente (nota: non ho ancora testato il codice)

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

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

Di seguito sono riportati alcuni esempi di codice per la conversione da / per COMP3 Per recuperare un decimale compresso da un array di byte vedi metodo getMainframePackedDecimal in http://record-editor.svn.sourceforge.net/viewvc/record-editor/Source/JRecord/src/net/sf/JRecord/Common/Conversion.java?revision=3&view=markup

e per impostare un vedere decimale imballato setField in http://record-editor.svn.sourceforge.net/viewvc/record-editor/Source/JRecord/src/net/sf/JRecord/Types/TypePackedDecimal.java?revision=3&view=markup

entrambi routine prendere un array di byte, una posizione di inizio e di un tratto di una posizione di campo.

Ci sono altri esempi di fare questo sul web (JRanch penso che ha il codice per fare la conversione pure), fare un po 'di googling.

Altri suggerimenti

Conversione zonato decimale comp-3 è abbastanza facile -. Capovolgere i nibbles del byte basso e spelare il nibble alto di tutti gli altri byte

Si consideri il numero 12345 - in notazione decimale imballato, che sarebbe un x'12345C 'o x'12345F' (sia C ed F sono +, A B e D sono -). Quando si convertita in a zone decimale, è capovolto il nibble basso e inserito un "F" nel nibble alto tra ogni cifra. Trasformandolo in x'F1F2F3F4C5' .

Per convertire indietro, basta invertire il processo. L'utilizzo di Java, che sarà simile:

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

Quando ho pasticciato con COMP-3 in passato con Java ho finito per scrivere un metodo per leggere i byte e convertirli in un numero. Non credo che io abbia mai dovuto scrivere COMP-3, ma suppongo che avrei usato la stessa logica in senso inverso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top