Programación General > Visual Basic 6.0 e inferiores
Convertir Ascii A Ebcdic (comp3)
(1/1)
memyyop:
Necesito converitr información de ASCII a EBCDIC, pero tengo problemas con los campos packed decimal (comp-3), ¿me pueden decir como convertir a un campo de este tipo?
Nebire:
Ignoro para que lo necesitas exactamente.
Aún conservo por ahí esta tabla, quizás te sirva.
Tabla_Ebcdic_Ascii:
--- Código: Text --- "\x00\x01\x02\x03\x37\x2D\x2E\x2F\x16\x05\x15\x0B\x0C\x0D\x0E\x0F" ' 00-0F "\x10\x11\x12\x13\x3C\x3D\x32\x26\x18\x19\x3F\x27\x22\x1D\x35\x1F" ' 10-1F "\x40\x5A\x7F\x7B\x5B\x6C\x50\x7D\x4D\x5D\x5C\x4E\x6B\x60\x4B\x61" ' 20-2F "\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\x7A\x5E\x4C\x7E\x6E\x6F" ' 30-3F "\x7C\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xD1\xD2\xD3\xD4\xD5\xD6" ' 40-4F "\xD7\xD8\xD9\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xAD\xE0\xBD\x5F\x6D" ' 50-5F "\x79\x81\x82\x83\x84\x85\x86\x87\x88\x89\x91\x92\x93\x94\x95\x96" ' 60-6F "\x97\x98\x99\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xC0\x4F\xD0\xA1\x07" ' 70-7F "\x43\x20\x21\x1C\x23\xEB\x24\x9B\x71\x28\x38\x49\x90\xBA\xEC\xDF" ' 80-8F "\x45\x29\x2A\x9D\x72\x2B\x8A\x9A\x67\x56\x64\x4A\x53\x68\x59\x46" ' 90-9F "\xEA\xDA\x2C\xDE\x8B\x55\x41\xFE\x58\x51\x52\x48\x69\xDB\x8E\x8D" ' A0-AF "\x73\x74\x75\xFA\x15\xB0\xB1\xB3\xB4\xB5\x6A\xB7\xB8\xB9\xCC\xBC" ' B0-BF "\xAB\x3E\x3B\x0A\xBF\x8F\x3A\x14\xA0\x17\xCB\xCA\x1A\x1B\x9C\x04" ' C0-CF "\x34\xEF\x1E\x06\x08\x09\x77\x70\xBE\xBB\xAC\x54\x63\x65\x66\x62" ' D0-DF "\x30\x42\x47\x57\xEE\x33\xB6\xE1\xCD\xED\x36\x44\xCE\xCF\x31\xAA" ' E0-EF "\xFC\x9E\xAE\x8C\xDD\xDC\x39\xFB\x80\xAF\xFD\x78\x76\xB2\x9F\xFF" ' F0-FF
Puedes buscar información adicional en las APIs de SNA (System Network Arquitecture) concretamente una función llamada CSV . CSV convierte entre EBCDIC y ASCII, pero claro supongo que sólo lo quieres para trabajar con la base de datos no para comunicaciones, pero bueno tu decides, si le echas un vistazo o no.
memyyop:
Gracias por la respuesta, pero lo que necesito es armar una rutina de código que convierta ASCII a EBCDIC, no tengo ningun problema con los tipos de dato character y numerico, pero con los tipo COMP-3 es con los que aún no puedo resolver el problema, esto lo necesito para transferir archivos hacia el mainframe.
Nebire:
A ver, creo que ta respondí, usando la tabla de conversión deberías poder crear tu rutina (NOTA: la tabla está mal nombrada en realidad es la conversión de ASCII a EBCDIC y no al revés como la he nombrado).
Corríjeme si me equivoco... el tipo de dato comp-3 está codificado en BCD.
Si es así implica que los números del 0 al 9 están en binario, esto es usando paquetes de 4 bits por cada dígito más otro paquete para el signo del nº. Entonces 000=0 ; 0001=1 .. 1001=9 en cuanto al signo creo recordar que se usa 1100 para positivo y 1101 para el negativo, aunque esto a veces podía variar el signo es siempre el paquete de la 'derecha' es decir el menos significativo... si la cifra no tiene signo se usa 1111 para indicarlo.
Luego no indicas si los valores son sólo packed o zoned, asumo que a falta de una indicaciónmás precisa son packed, entonces resolvemos los valores:
si tu número es entero puete tener entre 1 y 16 bytes
para valores aritméticos pueden tener entre 1 y 31 bytes
cada byte contiene 2 dígitos decimales (en BCD como se explicaba antes) excepto el byte de signo (que siempre es el de menor peso), en dicho caso el signo está a la derecha del todo.
a la izquierda podrás colocar los 'ceros' que necesites...
ejemplo:
--- Código: Text --- decimal (en decimales) - comp3 (en hexadecimal) - comp3 en binario - 4782 04 78 2D 0000.0100 0111.1000 0010.1101 traducción: 4 7 8 2 signo
un posible código podría ser algo como esto:
--- Código: Text --- Public BCD(0 To 12) As String ' 10 dígitos más los '3' signos, positivo negatvo y sin signo ' asignamos la matriz BCD de una vez ...para sucesivos usosPrivate Sub Form_Load() Call AsignarMatriz_BitBCDEnd Sub ' se invoca en el load del formulario...' se toman como valores decimales de '0' ó '1'Public Sub AsignarMatriz_BitBCD() BCD = Split("0000\0001\0010\0011\0100\0101\0110\0111\1000\1001\1100\1101\1111", "\") ' 0-9, +, - ' ahora añadimos la parte alta de cada valor mirar tabla de conversión, valores 30-39 ASCII corresponden a valores F0-F9 en EBCDIC: for k= 0 to 11 BCD(k)="1111" & BCD(k) next ' NOTA: también puedes desactivar este bucle y probar ...End Sub ' los datos tomados de fichero y convertidos a cadena ' la cadena debe recibirse en este formato : "+xxxxx..." ó "-xxxxx..." cuando tiene signo y "xxxx..." si es sin signo, es decir, si es preciso ' debe filtrarse por otra rutina para añadirse el '+' a las cadenas que lo requieran Public Function Convertir_DecimalaComp3(cadena As String, optional CerosAañadir as integer =0) As String ' si la cadena es sin signo, añadimos ahora el signo * delante sólo para tratar la cadena en el paso posterior dim digno as string signo= Left$(cadena, 1) If signo <> "-" and signo <>"+" Then cadena = "*" & cadena ' llamamos a la conversión cadena = ConvertirDecBin_ASCIIaEBCDIC(cadena) ' si necesitamos añadir 'ceros' a la izquierda es el momento de hacerlo' for k =0 to CerosaAñadir cadena= BCD(0) & cadena next ' y lo devolvemos Convertir_DecimalaComp3 =cadenaEnd Function ' trabajamos desde números decimales a binario como srting, tanto de entrada como salidaPrivate Function ConvertirDecBin_ASCIIaEBCDIC(cadena As String) As String ' las cadenas ya en esta rutina se deben recibir con el siguiente formato: ' "+xxxxx..." ó "-xxxxx..." "*xxxx..." es decir con el signo '+' '-' o sin signo '*' que hemos colocado a discreción, si es preciso ' debe filtrarse por otra rutina para añadirse tras ser tomado de fichero a las cadenas que lo requieran Dim salida As String ' anulado pasamos directamente a binario ' Const menos = "D": Const mas = "C" ' ó "F" Dim x As Byte For k = 2 To Len(cadena) ' empezamos por el 2 carácter... el signo lo dejamos para el final x = Int(Mid&(cadena, k, 1)) salida = salida & BCD(x) Next ' añadimos el signo a la parte correspondiente dim signo as string signo= Left$(cadena, 1) if signo="+" then x=10 elseif signo="-" then x=11 else x=12 end if salida = salida & BCD(x)) ' ya tenemos convertido la cifra en formato binario pero como valor de string. ConvertirDecHex_ASCIIaEBCDIC = salidaEnd Function
Posiblemente no te funcione tal cual y debas hacer modificaciones, yo no tengo aquí nada con que probarlo y hacer correciones, para ello necesitarás probarlo con el mainframe... Si no consigues resolverlo a pesar de todo, en un foro de Cobol seguramente te podrán prestar algo más de ayuda.
...ya nos contarás como te fue...
p.d. se me olvidaba... fíjate que la conversión BCD del 0 al 9 están localizados en la tabla ASCII desde el 30h (48 en decimal es el dígito para el 0) hasta el 39h (57 en decimal=9 en ASCII) siendo los valores para EBCDIC = F0 hasta el F9 , por lo que he añadido una nota en la asignación de la matriz BCD por si quieres intentar desactivando el bucle, comentándolo... para limitar esta situación.
Navegación
Ir a la versión completa