Преобразование 32-разрядного целого числа без знака (big endian) в long и обратно - PullRequest
8 голосов
/ 25 марта 2012

У меня есть байт [4], который содержит 32-разрядное целое число без знака (в порядке с прямым порядком байтов), и мне нужно преобразовать его в long (так как int не может содержать число без знака).

Кроме того, как мне сделать это наоборот (то есть от long, который содержит 32-разрядное целое число без знака в байтах [4])?

Ответы [ 3 ]

11 голосов
/ 25 марта 2012

Звучит как работа для ByteBuffer .

Отчасти как

public static void main(String[] args) {
    byte[] payload = toArray(-1991249);
    int number = fromArray(payload);
    System.out.println(number);
}

public static  int fromArray(byte[] payload){
    ByteBuffer buffer = ByteBuffer.wrap(payload);
    buffer.order(ByteOrder.BIG_ENDIAN);
    return buffer.getInt();
}

public static byte[] toArray(int value){
    ByteBuffer buffer = ByteBuffer.allocate(4);
    buffer.order(ByteOrder.BIG_ENDIAN);
    buffer.putInt(value);
    buffer.flip();
    return buffer.array();
}
8 голосов
/ 25 марта 2012

Вы можете использовать ByteBuffer, или вы можете сделать это по старинке:

long result = 0x00FF & byteData[0];
result <<= 8;
result += 0x00FF & byteData[1];
result <<= 8;
result += 0x00FF & byteData[2];
result <<= 8;
result += 0x00FF & byteData[3];
1 голос
/ 25 марта 2012

В Гуаве есть полезные классы для работы с числовыми значениями без знака.

http://docs.guava -libraries.googlecode.com / мерзавец / Javadoc / COM / Google / общие / примитивы / UnsignedInts.html # toLong (интермедиат )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...