2016-05-05 7 views
0

У меня есть поле pic X (03) с датой в нем как формат X'160101 'yymmdd.Декодирование двоичного кодированного десятичного разряда

Я хотел бы знать, как его преобразовать в pic x (06).

До сих пор я пытался переместить его обратно на 9 (03) comp и переместить 9 (03) на 9 (06), но это не сработало.

Как я могу это сделать?

ответ

2

Если вы ищете stackoverflow, вы должны найти ответ (на это уже был дан ответ).

Но Создание поля типа (моя-дата-х содержит дату):

03 my-date-x   pic x(3). 
    03 my-date-9   pic 9(6). 

    03 date-ymdv0   pic 9(6)v9 comp-3. 
    03 date-x    pic x(3) redefines date-ymdv0. 

И код

Move 0     to date-ymdv0 
    Move my-date-x   to date-x 
    Move date-ymdv0   to my-date-9 

Причина это работает для 9 (6) v9 comp3 160101 хранится как x'1601010c ' , что есть у вас (+ a 0c в конце).

+0

Спасибо, что это решение работает отлично! – user3127986

+1

@ user3127986 Тогда вы должны принять этот ответ. Вы должны увидеть контур большого тика рядом с ответом, нажмите на него. Лично я бы сделал REDEFINES по-разному, чтобы включить PIC X (может быть FILLER) (сделайте команду REDEFINES группой, затем часть, в которой вы нуждаетесь, затем FILLER), чтобы никто, глядя в будущее, не задавался вопросом, t. Это не будет иметь никакого значения для того, как он работает, он просто спасет кого-то, кто поцарапает голову. Конечно, если бы вы попробовали мои, вы бы нашли, что это работает. Просто другое определение данных. –

3

У вас есть двоичная кодированная десятичная (BCD). То есть данные хранятся в двоичном поле, но это десятичное представление, а не двоичное, что важно для значения. X'160101 'в будет 1 442 049. X'160201 'будет 1 442 305. Поэтому, если бы вы могли рассматривать это как двоичное поле (вам нужно было бы добавить двоичный нуль, чтобы сделать его правильной длиной для двоичного поля), вам придется делать глупые вычисления.

Итак, вы делаете что-то другое и проще. BCD не является родным типом данных COBOL. PACKED-DECIMAL (часто такой же, как COMP-3/COMPUTATIONAL-3) является BCD-типом, который включает значение знака в младшем (почти правее) полубайте. Так что не совсем BCD, но вы можете обращаться со своими BCD в упакованном десятичном так:

01 BCD-TO-PACKED. 
    05 BTP-SOURCE-BCD     PIC XXX. 
    05 BTP-PACKED-ZERO PACKED-DECIMAL PIC 9 VALUE ZERO. 
01 FILLER 
    REDEFINES BCD-TO-PACKED. 
    05 BTP-PACKED-TO-MOVE 
         PAKCED-DECIMAL PIC 9(6)V9. 

01 DATE-AS-PIC-X      PIC X(6). 
01 DATA-AS-CHARACTER-NUMERIC 
    REDEFINES DATE-AS-PIC-X    PIC 9(6). 


    MOVE your-source-value  TO BTP-SOURCE-BCD 
    MOVE BTP-PACKED-TO-MOVE  TO DATA-AS-CHARACTER-NUMERIC 

После этого можно спокойно ссылаться на DATE-AS-PIC-X, чтобы делать все, что вы хотите с ним.

BCD-TO-PACKED - это четырехбайтовое групповое поле, которое через предложение VALUE и ничем не изменяющееся имеет в последнем случае X'0F '. Это неподписанное упакованное десятичное поле с одной цифрой и значением нуля.

Затем вы делаете X-to-X MOVE для BTP-SOURCE-BCD. BCD-TO-PACKED теперь выглядит так: X'1601010F '. Это отлично подходит для упакованного десятичного поля. Вы можете разделить это на 10, чтобы получить свою дату (ПЕРЕДАЧАЕТ это как PACKED-DECIMAL PIC 9 (7)), но зачем тратить процессор?

Вместо этого в REDEFINES вы определяете одно десятичное место (V9). Когда компилятор генерирует код для ПЕРЕМЕЩЕНИЯ, чтобы в другое числовое поле без десятичных знаков, десятичное (ые) место (ы) источника просто выпадали. Presto! Разделите на 10 без деления.

Примечание. Названия имен выбраны для того, чтобы помочь объяснению. Вы должны сделать свой смысл для данных, а не просто использовать «банальные» имена. «Число символов» называется ИСПОЛЬЗОВАНИЕ DISPLAY в COBOL, это значение по умолчанию, если ИСПОЛЬЗОВАНИЕ не поставляется. Слово ИСПОЛЬЗОВАНИЕ редко используется само по себе. Таким образом, ИСПОЛЬЗОВАНИЕ DISPLAY - это то, что у вас есть, когда есть поле PIC X или PIC 9 без какого-либо другого использования.

Примечание: Вероятно, вы не должны использовать двузначные годы. Вы не сможете иметь дело с датами раньше 2000 года или позже 2199 года. Историческое использование двузначных лет было связано с дорогостоящим дисковым хранилищем и «избыточным объемом данных» (все значения в столетии составляли 19, поэтому зачем хранить значение 19 80 разное время для одной учетной записи). Если вы используете двузначные годы, убедитесь, что есть что-то, что имеет отношение к столетию.

Примечание. Если вы попытаетесь перенести поле PIC X в числовое поле, компилятор предположит, что у вас есть допустимые номера символов в поле, что является одной из причин, по которым ваша первоначальная попытка не удалась.

+0

Вы не имеете в виду _hexadecimal_, когда вы пишете двоичный файл? – knittl

+0

@knittl не очень, нет. Шестнадцатеричный - это всего лишь обозначение. –