Как преобразовать распакованную десятичную дробь обратно в COMP-3?[закрыто]
-
30-09-2019 - |
Вопрос
Я задал вопрос о преобразовании полей COMP, на который не получил ответа.
Я надеюсь, что переполнение стека поможет мне в этом вопросе.
Мне удалось преобразовать COMP-3 в десятичный формат.Мне нужна ваша помощь в преобразовании распакованного десятичного числа обратно в COMP-3 на любом языке программирования высокого уровня, но желательно на Java или C#.net.
Решение
В упакованном десятичном десятике - 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/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 +, ab и 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, но я предполагаю, что использовал бы ту же логику в обратном порядке.