• Lunes 6 de Mayo de 2024, 12:46

Autor Tema:  Convertir Ascii A Ebcdic (comp3)  (Leído 8122 veces)

memyyop

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Convertir Ascii A Ebcdic (comp3)
« en: Martes 27 de Mayo de 2008, 04:32 »
0
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

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Convertir Ascii A Ebcdic (comp3)
« Respuesta #1 en: Martes 27 de Mayo de 2008, 11:07 »
0
Ignoro para que lo necesitas exactamente.
Aún conservo por ahí esta tabla, quizás te sirva.

Tabla_Ebcdic_Ascii:
Código: Text
  1.  
  2. "\x00\x01\x02\x03\x37\x2D\x2E\x2F\x16\x05\x15\x0B\x0C\x0D\x0E\x0F" ' 00-0F
  3. "\x10\x11\x12\x13\x3C\x3D\x32\x26\x18\x19\x3F\x27\x22\x1D\x35\x1F" ' 10-1F  
  4. "\x40\x5A\x7F\x7B\x5B\x6C\x50\x7D\x4D\x5D\x5C\x4E\x6B\x60\x4B\x61" ' 20-2F
  5. "\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\x7A\x5E\x4C\x7E\x6E\x6F" ' 30-3F  
  6. "\x7C\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xD1\xD2\xD3\xD4\xD5\xD6" ' 40-4F
  7. "\xD7\xD8\xD9\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xAD\xE0\xBD\x5F\x6D" ' 50-5F  
  8. "\x79\x81\x82\x83\x84\x85\x86\x87\x88\x89\x91\x92\x93\x94\x95\x96" ' 60-6F
  9. "\x97\x98\x99\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xC0\x4F\xD0\xA1\x07" ' 70-7F
  10. "\x43\x20\x21\x1C\x23\xEB\x24\x9B\x71\x28\x38\x49\x90\xBA\xEC\xDF" ' 80-8F  
  11. "\x45\x29\x2A\x9D\x72\x2B\x8A\x9A\x67\x56\x64\x4A\x53\x68\x59\x46" ' 90-9F
  12. "\xEA\xDA\x2C\xDE\x8B\x55\x41\xFE\x58\x51\x52\x48\x69\xDB\x8E\x8D" ' A0-AF
  13. "\x73\x74\x75\xFA\x15\xB0\xB1\xB3\xB4\xB5\x6A\xB7\xB8\xB9\xCC\xBC" ' B0-BF  
  14. "\xAB\x3E\x3B\x0A\xBF\x8F\x3A\x14\xA0\x17\xCB\xCA\x1A\x1B\x9C\x04" ' C0-CF
  15. "\x34\xEF\x1E\x06\x08\x09\x77\x70\xBE\xBB\xAC\x54\x63\x65\x66\x62" ' D0-DF
  16. "\x30\x42\x47\x57\xEE\x33\xB6\xE1\xCD\xED\x36\x44\xCE\xCF\x31\xAA" ' E0-EF
  17. "\xFC\x9E\xAE\x8C\xDD\xDC\x39\xFB\x80\xAF\xFD\x78\x76\xB2\x9F\xFF" ' F0-FF
  18.  
  19.  

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.
«Ma non troppo»
----> ModoVacaciones = False<----

memyyop

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Convertir Ascii A Ebcdic (comp3)
« Respuesta #2 en: Martes 27 de Mayo de 2008, 16:31 »
0
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

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Convertir Ascii A Ebcdic (comp3)
« Respuesta #3 en: Jueves 29 de Mayo de 2008, 16:35 »
0
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
  1.  
  2.     decimal (en decimales)          - comp3 (en hexadecimal)                 - comp3 en binario
  3.            - 4782                              04 78 2D                    0000.0100  0111.1000 0010.1101
  4.                      traducción:            4  7 8 2 signo
  5.  
  6.  


un posible código podría ser algo como esto:
Código: Text
  1.  
  2. Public BCD(0 To 12) As String ' 10 dígitos más los '3' signos, positivo negatvo y sin signo
  3.  
  4. ' asignamos la matriz BCD de una vez ...para sucesivos usos
  5. Private Sub Form_Load()
  6.     Call AsignarMatriz_BitBCD
  7. End Sub
  8.  
  9. ' se invoca en el load del formulario...
  10. ' se toman como valores decimales de '0' ó '1'
  11. Public Sub AsignarMatriz_BitBCD()
  12.     BCD = Split(&#34;0000&#092;0001&#092;0010&#092;0011&#092;0100&#092;0101&#092;0110&#092;0111&#092;1000&#092;1001&#092;1100&#092;1101&#092;1111&#34;, &#34;&#092;&#34;) ' 0-9, +, -
  13.    ' 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:
  14.     for k= 0 to 11
  15.          BCD(k)=&#34;1111&#34; & BCD(k)
  16.      next
  17.     ' NOTA:  también puedes desactivar este bucle y probar ...
  18. End Sub
  19.  
  20. ' los datos tomados de fichero y convertidos a cadena
  21.  ' la cadena debe recibirse en este formato :  &#34;+xxxxx...&#34; ó &#34;-xxxxx...&#34;  cuando tiene signo y &#34;xxxx...&#34; si es sin signo, es decir, si es preciso ' debe filtrarse por otra rutina para añadirse el '+' a las cadenas que lo requieran
  22.  
  23. Public Function Convertir_DecimalaComp3(cadena As String, optional  CerosAañadir as integer =0) As String
  24.         ' si la cadena es sin signo, añadimos ahora el signo * delante sólo para tratar la cadena en el paso posterior
  25.     dim digno as string
  26.    signo= Left&#036;(cadena, 1)
  27.     If signo &#60;&#62; &#34;-&#34;  and signo &#60;&#62;&#34;+&#34; Then cadena = &#34;*&#34; & cadena
  28.     
  29.     ' llamamos a la conversión
  30.    cadena = ConvertirDecBin_ASCIIaEBCDIC(cadena)
  31.  
  32.    ' si necesitamos añadir 'ceros' a la izquierda es el momento de hacerlo'
  33.    for k =0 to CerosaAñadir
  34.        cadena= BCD(0) & cadena
  35.    next
  36.  
  37.    ' y lo devolvemos
  38.     Convertir_DecimalaComp3 =cadena
  39. End Function
  40.  
  41.  
  42. ' trabajamos desde números decimales a binario como srting, tanto de entrada como salida
  43. Private Function ConvertirDecBin_ASCIIaEBCDIC(cadena As String) As String
  44.     ' las cadenas ya en esta rutina se deben recibir con el siguiente formato:
  45.     '   &#34;+xxxxx...&#34; ó &#34;-xxxxx...&#34; &#34;*xxxx...&#34; 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
  46.     Dim salida As String
  47.     ' anulado pasamos directamente a binario ' Const menos = &#34;D&#34;: Const mas = &#34;C&#34; ' ó &#34;F&#34;
  48.     Dim x As Byte
  49.     For k = 2 To Len(cadena)   ' empezamos por el 2 carácter... el signo lo dejamos para el final
  50.        x = Int(Mid&(cadena, k, 1))
  51.        salida = salida & BCD(x)
  52.     Next
  53.    '  añadimos el signo a la parte correspondiente
  54.     dim signo as string
  55.     signo= Left&#036;(cadena, 1)
  56.      if signo=&#34;+&#34; then
  57.          x=10
  58.      elseif signo=&#34;-&#34; then
  59.          x=11
  60.      else
  61.         x=12
  62.      end if
  63.     salida = salida & BCD(x))
  64.     ' ya tenemos convertido la cifra en formato binario pero como valor de string.
  65.    ConvertirDecHex_ASCIIaEBCDIC = salida
  66. End Function
  67.  
  68.  

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.
«Ma non troppo»
----> ModoVacaciones = False<----