Pregunta

Estoy utilizando aplicación EBCDIC de Jon Skeet en .NET para leer un archivo descargado VSAM en modo binario con FTP desde un sistema de ordenador central. Funciona muy bien para la lectura / escritura en esta codificación, pero no tiene nada para leer los valores-decimal empaquetado. Mi archivo contiene estos, y tengo que desempaquetar los archivos (a costa de más bytes, obviamente).

¿Cómo puedo hacer esto?

Mis campos se definen como PIC S9(7)V99 COMP-3.

¿Fue útil?

Solución

Ahh, BCD. Honk si lo utilizó en 6502 el montaje.

Por supuesto, la mejor apuesta es dejar que el MOVIMIENTO COBOL hacer el trabajo para usted! Una de estas posibilidades puede ayudar.

(Posibilidad # 1) Suponiendo que se tiene acceso a la computadora central y el código fuente y el archivo de salida es sólo para su uso, modificar el programa por lo que sólo mueve el valor a un (7) V99 llano sin embalaje PIC S9 .

(Posibilidad # 2) Suponiendo que no es tan fácil, (por ejemplo, un archivo es de entrada para los metales del grupo, o no puede cambiar el código), se puede escribir otro programa COBOL en el sistema que lee el archivo y escribe otra. Cortar y pegar el diseño de registro del archivo con el BCD en el nuevo programa para los archivos de entrada y de salida. Modificar la versión de salida a no ser embalado. Leer un registro, hacer un 'movimiento correspondiente' para transferir los datos, y escribir, hasta EF. A continuación, traslado que archivo.

(Posibilidad # 3) Si no se puede tocar el mainframe, tenga en cuenta la descripción en el artículo se enlazó en su comentario. BCD es relativamente simple. Es podría ser tan fácil como esto (vb.net):

Private Function FromBCD(ByVal BCD As String, ByVal intsz As Integer, ByVal decsz As Integer) As Decimal
    Dim PicLen As Integer = intsz + decsz
    Dim result As Decimal = 0
    Dim val As Integer = Asc(Mid(BCD, 1, 1))
    Do While PicLen > 0
        result *= 10D
        result += val \ 16
        PicLen -= 1
        If PicLen > 0 Then
            result *= 10D
            result += val Mod 16
            PicLen -= 1
            BCD = Mid(BCD, 2)
        End If
        val = Asc(Mid(BCD, 1, 1))
    Loop
    If val Mod 16 = &HD& Then
        result = -result
    End If
    Return result / CDec(10 ^ decsz)
End Function

I probado con algunas variaciones de esta llamada:

MsgBox(FromBCD("@" & Chr(13 + 16), 2, 1))

por ejemplo., Es -40.1. Pero sólo unos pocos. Por lo que todavía podría estar equivocado.

Así que si su comp-3 comienza, por ejemplo, en el byte 10 del diseño de registro de entrada, esto resolvería él:

dim valu as Decimal = FromBCD(Mid(InputLine,10,5), 7,2))

Tomando nota de las fórmulas del artículo de conversión de datos para el # de bytes a enviar, y el # de 9 de antes y después de la V.

almacenar el resultado en un decimal para evitar errores de redondeo. Especialmente si se trata de $$$. Boya y doble hará que pena! Si usted no está de procesarlo, incluso una cadena es mejor.

Por supuesto que podría será más difícil. Donde trabajo, la unidad central es de 9 bits por byte. Grave. Eso es lo que hace que las 2 primeras posibilidades de modo sobresaliente. Por supuesto, lo que realmente les hace mejor es el hecho del que puede ser un PC solamente programador y esto es una gran excusa para conseguir un programador de computadora central para hacer el trabajo para usted! Si son tan afortunados de tener esa opción ...

Paz, -Al

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