как упакованы десятичные значения. как написать node js logi c для упакованного десятичного числа переменной типа PI C S9 (09) V99 COMP-3 - PullRequest
1 голос
/ 16 января 2020

У меня есть переменные типа PI C S9 (09) V99 COMP-3 и PI C S9 (07) COMP-3 в файле. Мне нужно разобрать его и получить значение в node js. Не могли бы вы помочь мне понять это на простых примерах. Также помогите мне понять, как хранятся данные для того же

1 Ответ

0 голосов
/ 17 января 2020

Cobol естественным способом работы с числом является двоично-десятичный десятичный код BCD.

  1. "Classi c" PI C (ИСПОЛЬЗОВАНИЕ - ДИСПЛЕЙ)

    ТЕОРИЯ:

    Когда вы пишете PI C S9 (4) V9 (3) со значением USAGE DISPLAY, то есть без записи COMP-3, это BCD.

    Таким образом, при записи числа, di git занимает один октет (то есть 8 бит) для хранения. Каждый октет можно разделить на два квартета, также известный как клев. Квартет - это группа из 4 битов. Таким образом, написание ди git занимает два квартета, то есть 2 * 4 бита, который добавляет до 8 бит = 1 октет.

    При записи ди git первый квартет будет содержать значение, которое представляют знак, который несет ди git. Единственный ди git, который несет знак, является последним. Положительное значение равно C (как кредит) в шестнадцатеричном и 1100 в двоичном виде. Минус D (как дебет) в шестнадцатеричном и 1101 в двоичном. Нейтральная буква - F в шестнадцатеричном формате и 1111 в двоичном.

    Второй квартет будет содержать двоичное значение для вашего di git. Например, если мой ди git равен 7, квартет будет 0111.

    ПРИМЕР:

    Если я возьму пример, который я написал выше, PI C S9 (4) V9 (3), оно имеет 4 + 3 = 7 цифр. Требуется 7 октетов для хранения. Допустим, я хочу сохранить число + 0036.421

    , тогда 7 октетов будут 0033421

    • First di git 0: 1111 0000; который в шестнадцатеричном формате: F0
    • Второй ди git 0: 1111 0000; который в шестнадцатеричном формате: F0
    • Третий ди git 3: 1111 0011; что в Хью: F3
    • Четвертый ди git 6: 1111 0110; который в шестнадцатеричном формате: F6
    • Пятый ди git 4: 1111 0100; который в шестнадцатеричном формате: F4
    • Шестой ди git 2: 1111 0010; который в шестнадцатеричном формате: F2
    • Седьмой ди git 1: 1100 0001; который в Hex это: C1. Это di git carr ie знак для целого числа. Первый квартет C, потому что число положительное.
  2. COMP-3 PI C (десятичное число в упаковке)

    THEORY : Как видите, вы занимает много места (7 октетов !!!) для написания довольно небольшого числа. для сравнения, в двоичном коде с семью октетами вы можете хранить 2 ^ 56 значений! Таким образом, чтобы сохранить некоторую память, существует другой формат, упакованный десятичный, который вы можете использовать, добавив COMP-3 к вашему объявлению.

    В этом формате вместо сохранения di git в целом октете Возьми квартет. Хитрость заключается не в том, чтобы хранить знаки для цифр, которые не являются последними цифрами git. Потому что, как вы можете видеть выше, у большинства квартетов просто есть значение F для первого квартета, которые мало что передают или не дают никакой информации.

    Последний квартет последнего октета содержит знак целого числа. Поэтому, если у нас есть n цифр, нам нужно n + 1 квартет для хранения числа в упакованном десятичном виде. Таким образом, пространство, занимаемое числом с n цифрами в упакованном десятичном числе, будет равно foor ((n + 1) / 2). То есть наименьшее число октетов, которое содержит n + 1 квартет.

    ПРИМЕР: Мой pi c имеет длину 7 цифр, поэтому мне нужно 7 + 1 = 8 квартет = 4 октета.

    • Первый октет: 0000 0000; в шестнадцатеричном формате это 00 (первое di git равно 0, второе di git равно 0)
    • Второй октет: 0011 0110; у которого 36 в шестнадцатеричном формате (третий ди git равен 3, четвертый - 6)
    • третий октет: 0100 0010; в шестнадцатеричном - 42 (пятый ди git равен 4, шестой - 2)
    • четвертый октет: 0001 1100; который равен 1 C в шестнадцатеричном (седьмой ди git равен 1, а знак целого числа равен +)
...