У меня есть плоский файл EBCDIC, который нужно обработать с мейнфрейма в модуль C. Что может быть хорошим процессом преобразования значений COMP и COMP-3 в читаемые значения? Должен ли я преобразовывать символы ebcdic в ascii, а затем в шестнадцатеричный код для COMP-3? А для КОМП? Спасибо
Преобразование COMP и COMP-3 Packed Decimal в читаемое значение с помощью C
Ответы (2)
Билл Вуджер дал вам очень хороший совет в своих комментариях к вашему вопросу, на самом деле он ответил на вопрос и должен был опубликовать свои комментарии в качестве ответа.
Я хотел бы повторить некоторые из его тезисов и расширить некоторые другие.
Если вам нужно преобразовать файл, созданный из того, что, вероятно, является приложением COBOL, чтобы он мог быть прочитан какой-либо другой программой, отличной от COBOL, возможно, на машине с архитектурой, отличной от той, на которой он был создан, тогда вы должны потребовать, чтобы файл создаваться с использованием только отображаемых форматированных данных (т. е. всех символьных данных). Смешивание неотображаемых (бинарных, упакованных, закодированных) данных за пределами операционной среды, в которой они были созданы, — это просто формула долгосрочной боли. Вы получите удовольствие от решения различных проблем с последовательностью байтов между архитектурами и кодовая страница. Это то, для чего предназначены протоколы передачи файлов — они хорошо с этим справляются, поэтому не пытайтесь изобретать их заново. Короткий ответ: используйте FTP или аналогичный механизм передачи файлов для перемещения данных между машинами. И только транспортные отображаемые (символьные) данные.
Типы данных Packed Decimal (COMP-3) занимают различное количество байтов в зависимости от их конкретной компоновки PICTURE. Положение десятичной точки подразумевается, поэтому его нельзя определить без ссылки на ИЗОБРАЖЕНИЕ, используемое для ее определения. Поля Packed Decimal могут быть как знаковыми, так и беззнаковыми. Если со знаком, знак встраивается в младшие 4 бита младшей значащей цифры. Каждый байт типа данных Packed Decimal содержит две цифры, за исключением, возможно, первого и последнего байтов. Первый байт содержит только 1 цифру, если поле подписано и содержит четное количество цифр. Последний байт содержит 2 цифры, если он без знака, и только 1, если он знаковый. Есть несколько других тонкостей, о которых вам нужно знать, если вы хотите сделать свое собственное преобразование Packed Decimal в символ. На этом этапе, я надеюсь, вы понимаете, что это не будет тривиальным упражнением.
Двоичные (COMP) типы данных имеют другой, но не менее сложный набор проблем, требующих решения. Опять же, не тривиальное упражнение.
Итак, что вы должны делать? В общем, делайте так, как предложил Билл. Пусть программа, которая создает этот файл, использует форматы отображения для вывода (это означает, что вам не нужно ничего делать). Или, в противном случае, используйте утилиту, такую как DFSORT/SYNCSORT, которая сделает преобразования за вас. Для использования служебного маршрута по-прежнему требуется, чтобы у вас был исходный макет файла COBOL (и чтобы вы его понимали), чтобы выполнить преобразование. В крайнем случае можно просто написать простую программу на языке COBOL, которая выполняет чтение-запись-запись-запись, которая принимает неформатированные данные, перемещает каждое поле COMP-независимо в соответствующее поле DISPLAY и записывает его снова.
Как сказал Билл, если группа, создавшая этот файл, говорит вам, что создание выходного файла в формате DISPLAY слишком сложно/дорого, они лгут вам или они некомпетентны или просто слишком ленивы, чтобы выполнять работу, для которой их наняли. Я не могу придумать никаких других оправданий.
Используйте XML для передачи данных.
То есть напишите программу, которая преобразует ваш файл в символы (если на мэйнфрейме, оставайтесь с EBCIDIC, но числовые поля распаковываются и т. д.), а затем заключите каждую запись и каждое поле в теги XML.
Это позволяет избежать проблем с форматированием (какое поле находится в столбце 1, какое поле в столбце 2, являются ли разделители пробелами или запятыми или и т. д. до тошноты).
Затем передайте файл XML с помощью вашей любимой утилиты, которая преобразует EBCIDIC в ASCII.
ebcdic. - person Bill Woodger   schedule 12.03.2014SIGN IS SEPARATEи выберите, как вы хотите, чтобы он отображался. Если фактические десятичные точки вам полезны, измените подразумеваемую десятичную точку (V в числовойPICture) на.. Если вам нужна дополнительная помощь или вы хотите рассмотреть вариант СОРТИРОВКИ, задайте новый вопрос. - person Bill Woodger   schedule 13.03.2014