Установка двух целочисленных значений для создания длинного - PullRequest
0 голосов
/ 04 октября 2019

Я взял на себя проект, который имеет частично реализованную спецификацию. У меня есть сообщение с различными полями. Одно из полей имеет идентификатор (называемый DestinationID) типа long. Внутри этого идентификатора говорится, что первые 4 байта (давайте назовем это слева) представляют что-то одно, а остальные 4 байта (давайте назовем это правильно) представляют другое. В настоящее время он реализован как 2 целых. Учитывая, что у меня есть эти 2 целых, есть ли способ собрать их вместе, чтобы получить первоначальное длинное значение? Кроме того, эти поля имеют порядок байтов, поэтому 2 целых числа читаются как байты с прямым порядком байтов. И когда я собираюсь вместе, я тоже хочу получить немного порядка байтов. Я делаю проб и ошибок, и ниже мои результаты пока. Пожалуйста, укажите на любые ошибки, которые вы видите. Спасибо.

    int left = 262388740;  // 1st 4 bytes
    int right = 671091961; // Rest of 4 bytes

    long destinationID = ((right) << 32) | (left & 0xffffffffL); // Trying to put the 2 together to get the long value

    //Expected - f9 0c 00 28  04 bc a3 0f
    //Received - 28 00 0c f9  0f a3 bc 04 

Когда я печатаю (Long.toHexString(destinationID), я не получаю ожидаемое значение. Кажется, они поменялись местами.

1 Ответ

0 голосов
/ 04 октября 2019

Ваши байты записываются на LITTLE_ENDIAN. Обратите внимание, что f9 0c 00 28 и 28 00 0c f9 поменялись местами. Я бы предпочел бы ByteBuffer, а не прямому переключению битов. Например,

int left = 262388740;  
int right = 671091961; 
ByteBuffer bb = ByteBuffer.allocate(8);
bb.putInt(left);
bb.putInt(right);
bb.order(ByteOrder.LITTLE_ENDIAN);
long r = bb.getLong(0);
System.out.println(Long.toHexString(r));

Выходы (согласно запросу)

f90c002804bca30f
...