Java примитивное длинное переполнение - PullRequest
0 голосов
/ 05 марта 2019

Система C # генерирует данные и предоставляет данные в другую систему Java с использованием SBE (простое двоичное кодирование) с помощью primitiveType = "uint64" (long).

В Java, когда данные принимаются в виде длинных примитивов, они переполняются и в некоторых случаях приводят к –ve числам.

Как справиться с этой ситуацией?

1 Ответ

1 голос
/ 05 марта 2019

Вы можете получить без знака long как long, так как «long» не рассчитывается с long.Вы можете даже отобразить это длинное без знака, используя Long.toUnsignedString(n).

В противном случае сохраните его в BigInteger.Идеально загружается как 8 байтов с прямым порядком байтов.

// Some snippets, unordered, showing useful constructs.
long n = ...;
n = Long.reverseBytes();
byte[] bigendian = new byte[8];
ByteBuffer buf = ByteBuffer.wrap(bigendian); // .order(ByteOrder.LITTLE_ENDIAN);
buf.putLong(n);

// Creating a BigInteger from unsigned long's bytes, requiring big-endian order.
BigInteger num = new BigInteger(1, bigendian); // 1 = positive
...