Как определить числовое значение из файла vsam для упакованного предложения PIC cobol без написания программы на cobol?
Я использовал пакет утилит (vsmr), чтобы прочитать значения файла VSAM, и у меня есть доступный исходный код тетради.
Если у меня есть определения, подобные ниже (прошу прощения за форматирование)
01 RECORD
05 RECORD-X PIC S9(3)V99 COMP-3
05 RECORD-Y PIC S9(3)V99 COMP-3
05 RECORD-Z PIC S9(3) COMP-3
05 RECORD-ALPHA PIC X(10)
и у меня есть следующее в данных
00 20 0C 01 10 0C 01 00 0C
Как определить числовое значение для RECORD-X?
Я предполагаю, что RECORD-X занимает 3 байта, а значения 00 20 0C соответствуют значению RECORD-X, но я не знаю, как преобразовать его в удобочитаемое значение (алгоритмически, не обязательно программно).
Я также предположил бы, что значения 01 10 0C соответствуют значению для RECORD-Y. Верны ли мои предположения?
1 ответ
COMP-3 является реализацией двоичного кода (BCD). Каждый кусочек байта соответствует цифре, а последний кусочек содержит знак. Где у вас есть...
00 20 0C 01 10 0C 01 00 0C
... мы можем сопоставить первые три байта RECORD-X
и имеют значение +002,00. Куски знака со значением C, A, F или E арифметически считаются положительными; знак клев со значением B или D арифметически считается отрицательным. Десятичная точка не кодируется в данных, вы должны иметь определение поля, чтобы знать, где оно находится.
IBM Enterprise COBOL имеет понятие "предпочтительный знак", который означает C для положительного и D для отрицательного. Существуют оптимизации, которыми вы можете воспользоваться, если уверены, что все ваши данные являются "предпочтительным признаком".
Ваше предположение о RECORD-Y
правильно, его значение +11,00.
Если вы пишете на языке COBOL, вам не нужно реализовывать алгоритм для преобразования его в удобочитаемое значение, просто MOVE RECORD-X TO RECORD-X-DISPLAY
где RECORD-X-DISPLAY
определяется с PIC +999.99
,