Преобразование COMP и COMP-3 Packed Decimal в читаемое значение с помощью C

У меня есть плоский файл EBCDIC, который нужно обработать с мейнфрейма в модуль C. Что может быть хорошим процессом преобразования значений COMP и COMP-3 в читаемые значения? Должен ли я преобразовывать символы ebcdic в ascii, а затем в шестнадцатеричный код для COMP-3? А для КОМП? Спасибо


person entendezEJ    schedule 12.03.2014    source источник
comment
Безусловно, проще всего создать файл для системы ASCII без каких-либо полей, не отображаемых на дисплее. Это был бы простой шаг КОПИРОВАТЬ с СОРТИРОВКОЙ, и тогда вам нечего было бы делать в конце. Если это каким-то образом невозможно, просмотрите здесь некоторые из вопросов с пометкой ebcdic.   -  person Bill Woodger    schedule 12.03.2014
comment
Так вы говорите, что было бы лучше, если бы мой плоский файл был в формате ASCII?   -  person entendezEJ    schedule 13.03.2014
comment
То, что мы (из мейнфрейма) обычно пытаемся сделать, хорошо, может быть, только те, кто немного дольше, это специально создать файл для конкретной задачи, который является физически логической копией данных в символьном формате. Это EBCDIC, когда мы его создаем. Затем, используя любую утилиту для передачи его на машину, не являющуюся мейнфреймом (FTP, NDM, что угодно), заставьте утилиту выполнить встроенную трансляцию EBCDIC в ASCII. Затем получателю просто нужно проверить заголовки и трейлеры (ожидаемая дата, ожидаемое логическое имя файла, количество записей, некоторые итоги хэшей и т. д.). Затем ваш файл поступает в формате ASCII.   -  person Bill Woodger    schedule 13.03.2014
comment
У вас должно быть соглашение, подписанное до начала работы, о том, как это должно происходить. Ваша сторона должна спорить о данных персонажа, они будут стонать о необходимости дополнительной программы. Они либо лгут вам, либо некомпетентны, либо просто непрофессиональны. У вас не должно быть необходимости прикасаться к данным, прежде чем их можно будет использовать (не данные из банка, или данные, не прошедшие проверку/соответствие/нормативные/юридические лица). Это неправильно. Люди делают это. Проверка логического содержания должна быть всем, что вам требуется сделать перед обработкой.   -  person Bill Woodger    schedule 13.03.2014
comment
Я на самом деле новичок в проекте, поэтому я не знаю многих деталей проекта. Я попрошу об этом через некоторое время. Да, я уже рассматривал возможность использования для этого таблицы перевода. Я просто надеялся, что есть другой способ обойти это.   -  person entendezEJ    schedule 13.03.2014
comment
Они просят меня сделать все это на мейнфрейме. Как одна целая программа для преобразования символов COMP и COMP-3 в читаемые данные из значений EBCDIC. Пока что не могу прийти в себя. Спасибо Билл за ваше время.   -  person entendezEJ    schedule 13.03.2014
comment
Два простых варианта — это программа COBOL или SORT. Найдите программу на языке COBOL, которая читает и записывает последовательный файл. Удалите все, кроме обработки ввода-вывода. Используйте существующую тетрадь для входной записи и создайте новую тетрадь (или простой макет под ФД без тетради) без COMP/COMP-3 (чтобы по умолчанию они были USAGE DISPLAY) дайте полям разные имена для вывода. Нарежьте копии ваших макетов записей, чтобы у вас были только имена отдельных элементов данных, и добавьте MOVE в начало входных имен и TO в начало выходных имен (пробел между ними, конечно)   -  person Bill Woodger    schedule 13.03.2014
comment
Затем используйте редактор или что-нибудь еще, чтобы объединить строки один к одному, чтобы получить свои строки кода. Скопируйте в свою программу. Почти там. Вам просто нужно рассмотреть любые знаки, которые у вас есть, и что вы хотите сделать с любыми десятичными знаками, которые у вас есть.   -  person Bill Woodger    schedule 13.03.2014
comment
Знаки см. в руководстве по COBOL (Enterprise COBOL Language Reference, любая версия) для SIGN IS SEPARATE и выберите, как вы хотите, чтобы он отображался. Если фактические десятичные точки вам полезны, измените подразумеваемую десятичную точку (V в числовой PICture) на .. Если вам нужна дополнительная помощь или вы хотите рассмотреть вариант СОРТИРОВКИ, задайте новый вопрос.   -  person Bill Woodger    schedule 13.03.2014


Ответы (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 слишком сложно/дорого, они лгут вам или они некомпетентны или просто слишком ленивы, чтобы выполнять работу, для которой их наняли. Я не могу придумать никаких других оправданий.

person Community    schedule 13.03.2014
comment
Да, но вопрос к этому времени уже был в комментарии :-) - person Bill Woodger; 13.03.2014

Используйте XML для передачи данных.

То есть напишите программу, которая преобразует ваш файл в символы (если на мэйнфрейме, оставайтесь с EBCIDIC, но числовые поля распаковываются и т. д.), а затем заключите каждую запись и каждое поле в теги XML.

Это позволяет избежать проблем с форматированием (какое поле находится в столбце 1, какое поле в столбце 2, являются ли разделители пробелами или запятыми или и т. д. до тошноты).

Затем передайте файл XML с помощью вашей любимой утилиты, которая преобразует EBCIDIC в ASCII.

person JackCColeman    schedule 17.03.2014
comment
Данные находятся в фиксированных позициях, поэтому нет проблем с тем, что где. ОП не просил XML. Даже при разделении по сравнению с XML необходимо учитывать производительность (количество полей, количество записей). - person Bill Woodger; 18.03.2014
comment
Билл Вуджер, я редко позволяю OP определять технические решения (XML или текст). Соображения производительности применяются при рассмотрении O (n) по сравнению с O (n * 2). Производительность не имеет значения при рассмотрении 100-байтовой записи и 500-байтовой записи. При необходимости для целей передачи сжимайте набор данных. - person JackCColeman; 24.03.2014
comment
Хорошо, извини, не знал, что они работают на тебя. Кажется, они игнорируют вашу спецификацию, вам лучше разобраться с этим. Я сказал количество полей, а не количество байтов. Если вы анализируете много XML и сравниваете с анализом эквивалентного количества разделителей, вы должны увидеть разницу. Еще одно, большее отличие от эквивалентных полей фиксированной длины. Странно предлагать XML для полей фиксированной длины, но вы главный. - person Bill Woodger; 24.03.2014
comment
@ Билл Вуджер, должен увидеть разницу, ах да, а ты видишь? Маловероятно, если между двумя методами нет разницы на порядок. Сила XML в том, что он ничего не знает о полях фиксированной или переменной длины. - person JackCColeman; 25.03.2014