У меня есть дамп "ленточного формата" кобола, в котором есть смесь текстовых и числовых полей. Я читаю файл на C # как двоичный массив (массив байтов). У меня есть тетрадь, и форматы отлично выстраиваются в текстовых полях. Также есть ряд полей COMP-3. Данные в этих полях не соответствуют формату BCD. Я знаю, какими должны быть данные, и у меня есть необработанные байты COMP-3. Сначала я попытался преобразовать в EBCDIC, что не дало лучших результатов. Есть ли какие-либо мысли о том, как номер COMP-3 может быть иначе сохранен внутри? Ниже приведены три примера PIC, необработанные данные и ожидаемое число. Я знаю, что у меня правильные позиции полей, потому что по обе стороны от чисел есть альфа-данные, и все они выровнены правильно.
Первый пример: PIC поля - 9 (9) COMP-3. Данные имеют 5 байтов, шестнадцатеричные значения - 02 01 20 91 22. В результате должны быть данные в виде даты (00CCYYMMDD). Эта конкретная дата должна быть 3-17-14.
Второй пример: PIC поля - S9 (3) COMP-3. Имеются 2 байта данных, шестнадцатеричные значения - 0A 14 Результирующее значение должно быть между 900 и 999 Насколько я понимаю, «S» означает, что последний полубайт должен быть 0xC или 0xD для обозначения + или -
Третий пример: PIC поля - S9 (15) V99 COMP-3. В данных 9 байтов, шестнадцатеричные значения - 00 00 00 00 00 00 01 80 0C. В результате должно получиться значение 12.00.
Хорошо, спасибо людям, которые откликнулись и указали мне правильное направление. Это действительно проблема представления ASCII / EBCDIC. BCD хранится в EBCDIC. Использование таблицы преобразования ASCII в EBCDIC дает правильно отформатированные цифры BCD:
Я использовал эту ссылку для сопоставления данных: http://shop.alterlinks.com/ascii-table/ascii-ebcdic-us.php
Мои данные: 0A 14 Преобразовано: 25 3C (оказалось, что 253 - допустимое значение, спецификация была неправильной) C = +, все хорошо
Мои данные: 01 80 0C (без начальных нулей) Преобразовано: 01 20 0C 12.00 C = +, подразумевается 2 цифры в формате, все в порядке
Мои данные: 02 01 20 91 22 Преобразовано: 02 01 40 31 7F 2014/03/17 (F - неиспользованный полубайт), все хорошо