EBCDIC при распаковке данных comp-3 возвращает 40404 ** в Java

Я использовал логику распаковки данных, приведенную в приведенной ниже ссылке для java. Как распаковать цифры COMP-3 с помощью Java? Но для нулевых данных в исходном коде он возвращает 404040404, как в коде распаковки Java. Я понимаю, что это был пробел в ebcdic, но как распаковать, обработав этот пробел или избежать его.

Вы можете просто сравнить поле с 0x40 в каждом символе, затем заменить его на 0x00 для всех, кроме последнего символа, и сделать это 0x0f. Итак, если это 3-байтовое поле, вы должны искать 0x40 в [0], [1] и [2], и если это 0x40 в каждом, то замените поля на [0] = 0x00 [1] = 0x00 [2] = 0x0f и это распакуется в 0

Hogstrom 01.04.2019 14:57

я пробовал, он также заменяет числовое значение 4. char[] NON_PRINTABLE_EBCDIC_CHARS = новый char[] {0x00, 0x40}; for (int currentByteIndex = 0; currentByteIndex < PackedData.length; currentByteIndex++) { //добавлено для проблем с типами данных comp и comp3 с нулевым символом int = PackedData[currentByteIndex]; логическое значение isBlank = ложь; for (char nonPrintableChar : NON_PRINTABLE_EBCDIC_CHARS) { if (nonPrintableChar == (char) символ) { isBlank=true; } } если(!пусто) {

Rajesh 01.04.2019 15:02

если исходное значение 444. Будет ли правильно декодировать? он не заменит на ноль?

Rajesh 01.04.2019 15:05

Если вы видите пробелы, скорее всего, у вас ошибка или несовпадение входных данных. Ни одна хорошо разработанная программа COBOL никогда не поместит пробелы в поле COMP-3.

zarchasmpgmr 01.04.2019 17:59

Я бы не стал проверять каждый байт, а просто посмотрел бы последний байт. Если он содержит допустимый знаковый фрагмент, я бы попытался распаковать поле и придумать какую-то стратегию для всех других случаев (вернуть 0, выдать ошибку,...?).

piet.t 02.04.2019 09:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
278
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть две проблемы, которые нам предстоит решить. Во-первых, являются ли данные действительными данными comp-3, а во-вторых, являются ли данные, которые считаются «действительными» в более старых языковых реализациях, таких как COBOL, с тех пор, как был упомянут Comp-3.

Если смещения не смещены, может показаться, что пробелы интерпретируются существующими программами как 0 вместо пробелов. Это было бы неправильно, но могло быть артефактом старых программ, которые были спроектированы так, чтобы допускать такое плохое поведение.

Подход, который я бы использовал в устаревшем магазине (при условии отсутствия смещения), заключается в том, чтобы считать «пробелы» (которые представляют собой последовательности 0x404040404040) равными нулю. Это будет устаревшая проверка, чтобы сравнить поле с пробелами, а затем предположить, что 0x00000000000f является фактическим значением по умолчанию. Это то, что должен определить отдельный магазин, и это не считается общим подходом к программированию.

С точки зрения Java, нужно помнить, что байты «подписаны», поэтому сравнения могут быть сложными в зависимости от того, как написан код. Единственный «беззнаковый» тип данных I вспомните, что в java есть char, который на самом деле состоит из двух байтов (единица 16).

Это не столько проблема программирования, сколько признание исторической терпимости и исправления.

Другие вопросы по теме