Интерпретация упакованных десятичных полей COMP-3 в числовые значения - PullRequest
5 голосов
/ 28 апреля 2009

Я создаю пакет служб SSIS для чтения распакованных данных из серии файлов тетради. Я не уверен в правильной интерпретации следующих определений полей и надеялся, что кто-то узнает:

ИМЯ-1 ПОС S9 (15) V9 (3) КОМП-3.
ПОЛЕ ИМЯ-2 ПОС S9 (3) V9 (8) КОМП-3.
ПОЛЕ ИМЯ-3 ПОС S9 (3) V9 (6) КОМП-3.

Данные хранятся в тексте с фиксированной шириной. Данные для вышеуказанных полей имеют следующую длину:

ИМЯ-1: 19 ПОЛЕ-ИМЯ-2: 11 ИМЯ-3: 9

Я не уверен, как интерпретировать десятичное место и знак.

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

С уважением, Ham

Ответы [ 5 ]

4 голосов
/ 30 апреля 2009

См. Метод getMainframePackedDecimal в http://jrecord.cvs.sourceforge.net/viewvc/jrecord/jrecord/src/net/sf/JRecord/Common/Conversion.java?revision=1.2&view=markup

для примера преобразования упакованного десятичного числа в java (это часть проекта jrecord jrecord.sf.net)

4 голосов
/ 28 апреля 2009

Вот немного другая попытка ответить на ваши вопросы.

PIC S9 (15) V9 (3) COMP-3 выглядит так в файле:

    00 00 00 00 00 00 00 00 00 0F

Если бы значение было -4568248.323, оно было бы:

    00 00 00 00 04 56 82 48 32 3D

Это не поможет вам, но может помочь другим. Распакованное предыдущее значение будет выглядеть так:

F0 F0 F0 F0 F0 F0 F0 F0 F0 F4 F5 F6 F8 F2 F4 F8 F3 F2 D3 (or F3 as the last byte, therefore losing the sign)

Это поле содержит 15 (фактически 16) цифр перед десятичной запятой и 3 после.

Хотя он запрашивает только 18 цифр (15 + 3), он получает 19, чтобы сделать его равным по длине полем со знаком (одна цифра добавляется впереди, чтобы длина файла составляла 10 байт). Лучше всего всегда делать упакованные поля нечетной длины, чтобы избежать этой путаницы.

** Последняя буква обозначает знак, C & F положительны, D отрицателен. Для вашей программы проверьте отрицательный (D) и, если нет, обработайте как положительный.

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

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

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

2 голосов
/ 09 июля 2009

Длина полей COMP-3 рассчитывается как число цифр, которое нам нужно сохранить + 1, деленное на 2. Например, для хранения числового поля со значением 987 нам потребуется 3 +1, деленное на 2 = 2. Следовательно, Comp 3 поля длиной 2 байта могут хранить значение от +999 до -999 в качестве ограничения.

15 будет храниться как 01 5C. Таким образом, последние четыре бита числа используются для хранения знака числа, которое является C или D, так что «C» представляет положительное число, а «D» представляет отрицательное число. И каждое числовое число занимает 4 бита, чтобы представлять себя.

Таким образом, для 7-значного числового числа потребуется 7 +1 = 8/2 = 4 байта. Таким образом, поле comp-3 размером 4 байта может хранить числовые цифры от +999,9999 до -999,9999 цифр.

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

как ПОЛЕ ИМЯ-3 PIC S9 (3) V9 (6) COMP-3.

нам нужно определить десятичное поле, например DEC-PORTION V9 (6) comp-3, а затем переместить FIELD-NAME-3 в DEC-PORTION, чтобы сохранить десятичную часть значения.

Таким образом, мы можем отделить десятичную часть числа от полного числа.

2 голосов
/ 28 апреля 2009

Обычно поля COMP-3 состоят из BCD цифр, упакованных по два байта за раз, каждая цифра использует полубайт (4 бита). Последняя цифра идет в верхнем клочке последнего байта. Нижний кусок последнего байта имеет 13, если число отрицательное, и что-то еще (обычно 12), если положительное. Десятичная точка подразумевается.

Например, -1,2 выглядит в шестнадцатеричном виде, последний D - отрицательный знак.

   01 2D

12,345:

   12 34 5C
2 голосов
/ 28 апреля 2009

Вот и мы:

ПИК это "картинка"
S9 (15) означает 15-значное числовое поле со знаком: S для знака, 9 для чисел, (15) для длины. V - десятичная позиция 9 (3) - это трехзначное число

и COMP-3 - десятичное число в кодировке BCD. Каждый nybble (полубайт) поля является десятичным значением в двоичном формате, поэтому

0b01110110 (дух)

равно 76.

18 цифр требует 9 байтов, знак - младший байт младшего байта.

Что меня беспокоит, те должны требовать 10 байт.

Вот хорошая статья .

...