Pregunta

Me había hecho una pregunta sobre la conversión de campos de compensación, para los que no he tenido ninguna respuesta.

espero pila desbordamiento me puede ayudar en esta cuestión.

I tuvo éxito en la conversión de COMP-3 a decimal. Necesito su ayuda en la conversión de la parte posterior decimal descomprimido a COMP-3, en cualquier lenguaje de programación de alto nivel, pero preferiblemente en Java o C #.

¿Fue útil?

Solución

En decimal empaquetado -123 se representa como X'123d'(la última nyble c, d o f siendo la señal). Una de las formas más sencillas de manejar decimal empaquetado es simplemente convertir los bytes a una cadena hexadecimal (o viceversa según sea necesario) y luego utilizar la manipulación normal de cadena. Esto puede no ser la más eficiente, pero es fácil de implementar.

Así que para convertir un entero (valor) a decimal empaquetado es más o menos (nota: no he probado el código)

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

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

Los siguientes son un código de ejemplo para la conversión a / desde COMP3 Para recuperar un decimal empaquetado de una matriz de bytes véase el método getMainframePackedDecimal en http://record-editor.svn.sourceforge.net/viewvc/record-editor/Source/JRecord/src/net/sf/JRecord/Common/Conversion.java?revision=3&view=markup

y para establecer una sede decimal empaquetado setField en http://record-editor.svn.sourceforge.net/viewvc/record-editor/Source/JRecord/src/net/sf/JRecord/Types/TypePackedDecimal.java?revision=3&view=markup

ambas rutinas de tomar una serie de bytes, una posición de inicio y, o bien una longitud de una posición de campo.

Hay otros ejemplos de hacerlo en la web (JRanch creo que tiene código para hacer la conversión también), hacer un poco de google.

Otros consejos

La conversión de decimal a los zonificada-3 es muy fácil -. Flip los mordiscos del byte bajo y botar el nibble alto de todos los otros bytes

Considere el número 12345 - en notación decimal empaquetado, que sería un x'12345C 'o x'12345F' (ambos C y F son +, A B y D son -). Al convertir a zonificada decimal, que dio la vuelta al nibble bajo y se inserta una "F" en el nibble alto entre cada dígito. Convirtiéndose en x'F1F2F3F4C5' .

Para convertir de nuevo, que acaba de revertir el proceso. Utilización de Java, que se vería así:

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

Cuando me he metido con COMP-3 en el pasado con Java terminé escribiendo un método para leer los bytes y los convierte a un número. No creo que he tenido que escribir COMP-3, pero supongo que yo usaría la misma lógica a la inversa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top