Как конвертировать распакованный десятичный код обратно в COMP-3?

Я задал вопрос о преобразовании полей COMP, на который я не получил никакого ответа.

Я надеюсь, что переполнение стека поможет мне в этом вопросе.

Мне удалось преобразовать COMP-3 в десятичную. Мне нужна ваша помощь в преобразовании распакованного десятичного числа обратно в COMP-3, на любом языке программирования высокого уровня, но предпочтительно на Java или C#.net.

3 ответа

Решение

В упакованном десятичном виде -123 представляется как X'123d' (последним nyble c,d или f является знак). Один из самых простых способов обработки упакованных десятичных чисел - просто преобразовать байты в шестнадцатеричную строку (или наоборот, как требуется), а затем использовать обычную обработку строк. Это может быть не самым эффективным, но это легко реализовать.

Таким образом, преобразовать целое число (значение) в упакованный десятичный код примерно (примечание: я не проверял код)

String sign = "c";
if (value < 0) {
    sign = "d";
    value = -1 * value;
}
String val = value + "d"

byte[] comp3Bytes = new BigInteger(val, 16).toByteArray();

Ниже приведен пример кода для преобразования в / из comp3. Для извлечения упакованного десятичного числа из массива байтов см. Метод getMainframePackedDecimal в http://record-editor.svn.sourceforge.net/viewvc/record-editor/Source/JRecord/src/net/sf/JRecord/Common/Conversion.java?revision=3&view=markup

и установить упакованный десятичный раздел см. setField в http://record-editor.svn.sourceforge.net/viewvc/record-editor/Source/JRecord/src/net/sf/JRecord/Types/TypePackedDecimal.java?revision=3&view=markup

Обе процедуры принимают массив байтов, начальную позицию и длину поля.

Есть и другие примеры этого в Интернете (я думаю, у JRanch есть код для преобразования), немного погуглите.

Преобразование зонированной десятичной дроби в comp-3 довольно просто - переверните полубайты младшего байта и уберите верхний кусочек всех остальных байтов.

Рассмотрим число 12345 - в упакованной десятичной записи, это будет x'12345C'или x'12345F' (C и F +, A B и D -). Когда вы преобразовали его в зонную десятичную дробь, вы щелкнули нижний полубайт и вставили "F" в верхний полубайт между каждой цифрой. Превращая это в x'F1F2F3F4C5'.

Чтобы преобразовать его обратно, просто измените процесс. Используя Java, это будет выглядеть так:

byte[] myDecimal = { 0xF1, 0xF2, 0xF3, 0xF4, 0xF5 };
byte[] myPacked = new byte[3];

//Even low nibble moved to high nibble and merged with odd low nibble
myPacked[0] = ((myDecimal[0] & 0b00001111)  << 4)) | (myDecimal[1] & 0b00001111);
myPacked[1] = ((myDecimal[2] & 0b00001111)  << 4)) | (myDecimal[3] & 0b00001111);

//Last byte gets filpped for sign
myPacked[2] = ((myDecimal[5] & 0b00001111)  << 4)) | (myDecimal[4] & 0b00001111);

Когда в прошлом я связывался с COMP-3 с Java, я закончил тем, что написал метод для чтения байтов и преобразования их в число. Я не думаю, что мне когда-либо приходилось писать COMP-3, но я предполагаю, что использовал бы ту же логику в обратном порядке.

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