C / C ++ long long в Java long - PullRequest
       19

C / C ++ long long в Java long

0 голосов
/ 09 февраля 2011

У меня есть файл на диске, который я читаю, который был написан кодом c / c ++.Я знаю, что нужно прочитать два 64-разрядных целых числа без знака, но Java не поддерживает целые числа без знака, поэтому значение, которое я получаю, когда выполняю DataInputStream.readLong (), неверно.(Пока игнорируем порядок байтов, на самом деле я использую производную от DIS под названием LEDataInputStream, которую я скачал из Интернета)

Многие посты здесь говорят об использовании BigInteger, но Javadoc для чтения только байтовых массивов говорито загрузке байтового массива, и вопросы, похоже, сосредоточены на том факте, что некоторые люди выходят за положительные границы типа java long, который я не буду близок к данным, которые я читаю.

Iу меня есть скрипт MATLab / Octave, который читает эти длинные длинные значения как два 32-разрядных целых числа каждое, а затем выполняет некоторое умножение и сложение, чтобы получить ответ, который ему тоже нужен.

Я полагаю, что вопрос - как мне читать64-разрядное целое число без знака, либо с использованием BigInteger, либо с использованием [LE] DataInputStream.XXX?

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 09 февраля 2011

Я бы предложил использовать ByteBuffer , а затем использовать код, такой как this , чтобы получить то, что вы хотите.

1 голос
/ 09 февраля 2011

Вы можете использовать long в качестве 64-битного значения для хранения данных без знака.Вот модуль, показывающий, что большинство операций без знака могут выполняться с использованием стандартного типа long.Это действительно зависит от того, что вы хотите сделать со значением, а именно от того, является ли это проблемой или нет.

РЕДАКТИРОВАТЬ. Обычный подход к обработке чисел без знака состоит в расширении типа данных.Это проще во многих случаях, но не является обязательным требованием (и для long использование BigInteger не упрощает ситуацию ИМХО)

EDIT2: Что не так со следующим кодом?

long max_unsigned = 0xFFFFFFFFFFFFFFFFl;
long min_unsigned = 0;
System.out.println(Unsigned.asString(max_unsigned) + " > "
        + Unsigned.asString(min_unsigned) + " is "
        + Unsigned.gt(max_unsigned, min_unsigned));

отпечатки

18446744073709551615 > 0 is true
0 голосов
/ 09 февраля 2011

сначала вы проверите этот вопрос

См. Также this

Теперь используется класс BigInteger

// Get a byte array
byte[] bytes = new byte[]{(byte)0x12, (byte)0x0F, (byte)0xF0};

// Create a BigInteger using the byte array
BigInteger bi = new BigInteger(bytes);

// Format to binary
String s = bi.toString(2);      // 100100000111111110000

// Format to octal
s = bi.toString(8);             // 4407760

// Format to decimal
s = bi.toString();              // 1183728

// Format to hexadecimal
s = bi.toString(16);            // 120ff0
if (s.length() % 2 != 0) {
    // Pad with 0
    s = "0"+s;
}


// Parse binary string
bi = new BigInteger("100100000111111110000", 2);

// Parse octal string
bi = new BigInteger("4407760", 8);

// Parse decimal string
bi = new BigInteger("1183728");

// Parse hexadecimal string
bi = new BigInteger("120ff0", 16);

// Get byte array
bytes = bi.toByteArray();
...