Как конвертировать распакованный десятичный код обратно в 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, но я предполагаю, что использовал бы ту же логику в обратном порядке.