C # codificar un archivo en EBCDIC con decimales empaquetados

Tengo que preparar un archivo para una entidad externa, y esta entidad usa un mainframe IBM con COBOL y requiere que el archivo esté codificado en EBCDIC. Estoy creando el archivo en C #. Supongo que esta es una pregunta de dos partes ... en primer lugar, ¿es suficiente el siguiente código para garantizar que el archivo se generará de manera que puedan leerlo?

StreamWriter sw = new StreamWriter(@"C:\EBCDICFileEquivalent.txt", false, Encoding.GetEncoding(37));

En segundo lugar, varios campos del archivo requieren decimal empaquetado, en el formato S (9) 13 COMP-3. Como ya he especificado la codificación EBCDIC, ¿puedo escribir el número decimal (por ejemplo, 1234500000001) en el archivo usando:

sw.WriteLine("1234500000001C"); 

... y ha salido correctamente en el archivo generado?

Nunca he hecho nada con EBCDIC o COMP-3.

preguntado el 16 de mayo de 11 a las 19:05

2 Respuestas

Ese código debería crear un archivo EBCDIC sin problemas. Por lo general, esto no es necesario, ya que el proceso FTP generalmente convertirá el archivo automáticamente de ASCII a EBCDIC, pero si ese no es el caso, entonces el archivo que está creando debe ser correcto y puede transmitirse como binario en lugar de texto.

Escribir el número como texto con las sustituciones adecuadas para satisfacer el formato decimal con signo zonificado de mainframe es el procedimiento correcto. Por supuesto, hacer estas sustituciones es una molestia, pero escribirlas como una cadena como lo está haciendo es la forma correcta de incluirlas en el archivo que el mainframe puede leer.

contestado el 17 de mayo de 11 a las 00:05

La parte de FTP es muy importante. Si realiza la conversión de ASCII a EBCDIC por su cuenta, deber asegúrese de realizar la transferencia utilizando el modo binario; de lo contrario, corre el riesgo de realizar una doble conversión del archivo. - Chris Haas

Sí, probablemente debería crear un archivo ASCII en el primer intento y dejar que el sistema haga las conversiones. Solo si eso no funciona, debería perder el tiempo creando un archivo EBCDIC. - Jeffrey L. Whitledge

@ dan04 - Mi respuesta no es incorrecta. El OP especificó EBCDIC y COMP-3, que no son formatos compatibles. Mi respuesta es correcta para los decimales divididos en zonas en EBCDIC. Confío en que su respuesta sea correcta para COMP-3 (con la que no tengo experiencia). Cuál de nuestras respuestas es aplicable depende de cuáles sean los requisitos reales, lo que no queda claro en la pregunta. - Jeffrey L. Whitledge

En segundo lugar, varios campos del archivo requieren decimal empaquetado, en el formato S (9) 13 COMP-3. Como ya he especificado la codificación EBCDIC, ¿puedo escribir el número decimal (por ejemplo, 1234500000001) en el archivo usando:

sw.WriteLine("1234500000001C");

... y ha salido correctamente en el archivo generado?

No, no puedes. Esa declaración escribiría los bytes EBCDIC:

F1 F2 F3 F4 F5 F0 F0 F0 F0 F0 F0 F0 F1 C3

Pero este campo es COMP-3. Eso no es caracteres codificados; es BCD con un signo nybble (C = positivo, D = negativo, F = sin signo).

12 34 50 00 00 00 1C

Suponiendo que la página de códigos 37 sea correcta, podría escribe esto en el archivo usando la cadena "\u0012\u0094&\u0000\u0000\u001C", pero tendría mucho más sentido escribir estos campos sin texto en modo binario.

contestado el 17 de mayo de 11 a las 15:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.