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