C # кодирование файла в EBCDIC с упакованными десятичными знаками - PullRequest
7 голосов
/ 16 мая 2011

Мне нужно подготовить файл для внешнего объекта, и этот объект использует мэйнфрейм IBM с COBOL и требует, чтобы файл был закодирован в EBCDIC. Я создаю файл в C #. Я полагаю, что это вопрос из двух частей ... во-первых, достаточно ли приведенного ниже кода, чтобы файл был сгенерирован так, чтобы он мог его прочитать?

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

Во-вторых, несколько полей в файле требуют упакованного десятичного числа в формате S (9) 13 COMP-3. Поскольку я уже указал кодировку EBCDIC, могу ли я просто записать десятичное число (например, 1234500000001) в файл, используя:

sw.WriteLine("1234500000001C"); 

... и правильно ли получилось в сгенерированном файле?

Никогда ничего не делал с EBCDIC или COMP-3.

Ответы [ 2 ]

2 голосов
/ 17 мая 2011

Этот код должен создать файл EBCDIC просто отлично.Обычно в этом нет необходимости, поскольку процесс FTP обычно автоматически конвертирует файл из ASCII в EBCDIC, но если это не так, то создаваемый вами файл должен быть правильным и может передаваться как двоичный, а не текстовый.

Запись числа в виде текста с соответствующими заменами для соответствия зонному десятичному формату в мэйнфреймах является правильной процедурой.Конечно, делать эти замены - боль, но записывать их в виде строки, как вы делаете, - это верный способ поместить его в файл, который может прочитать мэйнфрейм.

1 голос
/ 17 мая 2011

Во-вторых, несколько полей в файле требуют упакованного десятичного числа в формате S (9) 13 COMP-3.Поскольку я уже указал кодировку EBCDIC, могу ли я просто записать десятичное число (например, 1234500000001) в файл, используя:

sw.WriteLine("1234500000001C");

... и правильно ли оно получится всгенерированный файл?

Нет, вы не можете.Это утверждение записывает байты EBCDIC:

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

Но это поле равно COMP-3.Это не закодированные символы;это BCD со знаком nybble (C = положительный, D = отрицательный, F = без знака).

12 34 50 00 00 00 1C

Предполагая, что кодовая страница 37 верна, вы могли бы запишите это в файл, используя строку "\u0012\u0094&\u0000\u0000\u001C", но было бы гораздо разумнее записать эти нетекстовые поля в двоичном режиме.

...