получить Cobol S9 (2) COMP на переменную C - PullRequest
2 голосов
/ 04 января 2011

Мне нужно извлечь данные из переменной COBOL типа: " PIC S9 (2) COMP " в переменную C типа " int ".

Он хранится с использованием двух байтов строки, поэтому я получаю его в виде пары символов.

Я знаю, что COBOL сохраняет десятичные данные в " S9 (2) COMP " в двоичном формате, так что было бы очень полезно сообщить мне любой алгоритм или способ безопасного преобразования.

Любая помощь и предложение будут приветствоваться.

Обновление:

Наконец, мы решили изменить изображение переменной на 9 (3) в части реализации COBOL из-за проблемы с порядком байтов.

Спасибо всем вам за ответы.

Ответы [ 3 ]

2 голосов
/ 04 января 2011

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

1 голос
/ 06 января 2011

S9 (2) COMP указывает, что это выровненное по левому краю (бит 0 слева от слова) не синхронизированное по ширине числовое поле со знаком, возможно, во внутреннем или псевдобинарном формате, которое может содержать 2 цифры и, возможно, бит в слове (или в другом месте памяти) используется для указания положительного или отрицательного значения. Программа Cobol может иметь специальный метод для хранения элемента данных COMP, который может быть несовместим напрямую с C. Похоже, вам необходимо получить доступ и протестировать индикатор знака соответствующим образом, чтобы проверить его, и вам может потребоваться доступ к каждому из 2 байта (2 из 8 битов) или символы (2 из 6 битов), проверьте, являются ли они прямым или младшим порядком байтов, и поместите их в целочисленное поле со знаком в C. Многое будет зависеть от архитектуры и компиляторов компьютер участвует в создании и чтении в поле данных и может быть более сложным, если задействованы два типа компьютеров.

1 голос
/ 04 января 2011

Формат s9 (2) comp зависит от компилятора Cobol.Большинство известных мне компиляторов Cobol хранят в нем 2-байтовое целое число с прямым порядком байтов (сначала старший байт; сначала процессоры Intel сохраняют младший байт).Исключения включают

MicroFocus (зависит от параметров компиляции) - обычно 1-байтовое целое число RM-Cobol: имеет собственный «двоичный формат».

Если это 2-байтовое целое число

  • На машине с прямым порядком байтов (мэйнфрейм IBM, Power и т. Д.) Это должно быть 2-байтовое целое число
  • На Little-Endian (Intel) вам нужно поменять местами байты.
...