Как преобразовать распакованную десятичную дробь обратно в COMP-3?[закрыто]

StackOverflow https://stackoverflow.com/questions/4337912

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top