Я хотел бы использовать десятичные числа, представленные в массивах байтов (формат BCD), для выполнения математических приращений десятичных значений в виде массивов байтов.Двоичная кодированная десятичная математика во встроенной Java
Пример: Я хотел бы сделать 255 + 1
в математике, которая дает 256
. Когда сделано в формате двоичного массива, значение 255
будет 00000000FF
, а 1
- 0000000001
Значение в шестнадцатеричном представлении байтов. Ожидаемый результат будет 0000000100
.
Мой следующий код пытается сделать приращение массива 5 байтов 255
по 1
. Мои конечные результаты: 00000001FE
, который последний байт 0xFE
должен быть 0x00
. Как исправить мой алгоритм для правильного выполнения приращения массива 5 байтов, используя только базовые двоичные операнды (среда Java встроена)?
private static byte[] clkCtrCurr = new byte[5];
private static byte[] inc = {0x00, 0x00, 0x00, 0x00, 0x01};
private static byte buff;
private static byte carry;
public static void binAdd() {
buff = (byte) (clkCtrCurr[4]^inc[4]);
carry = (byte) (clkCtrCurr[4] & inc[4]);
clkCtrCurr[4] = buff;
clkCtrCurr[3] ^= carry;
buff = (byte) (clkCtrCurr[3]^inc[3]);
carry = (byte) (clkCtrCurr[3] & inc[3]);
clkCtrCurr[3] = buff;
clkCtrCurr[2] ^= carry;
buff = (byte) (clkCtrCurr[2]^inc[2]);
carry = (byte) (clkCtrCurr[2] & inc[2]);
clkCtrCurr[2] = buff;
clkCtrCurr[1] ^= carry;
buff = (byte) (clkCtrCurr[1]^inc[1]);
carry = (byte) (clkCtrCurr[1] & inc[1]);
clkCtrCurr[1] = buff;
clkCtrCurr[0] ^= carry;
clkCtrCurr[0] ^= inc[0];
}
Что имеется в виду под «базовыми двоичными операндами»? Почему мы не используем + в байтах, присваиваем целое число и не обрабатываем его? –
Это встроенная Java-система (JavaCard), которая может поддерживать или не поддерживать Int. Большая его поддержка - короткая, которая составляет 2 байта, а какой-то счетчик, такой как HOTP, требует таких вещей, как десятичные десятичные разряды размером 8-8 байтов, которые обычно обрабатываются в системе как байты. – thotheolh