2016-09-07 3 views
1

Я хочу, чтобы значение без знака малочисленного байтового массива DWORD.Преобразование массива байтов DWORD в длинное число без знака

Это то, что я писал:

private long getUnsignedInt(byte[] data) { 
     long result = 0; 
     for (int i = 0; i < data.length; i++) { 
      result += (data[i] & 0xFF) << 8 * (data.length - 1 - i); 
     } 
     return result; 
} 

Правильно ли это?

+0

Это дает вам ценности, которые вы ожидаете? – Kayaman

+0

Для того, что я тестировал, да, но я не могу понять, безопасно ли это «два дополнения». – Tobia

+0

Nice downvoter, может быть, мне не следовало публиковать код, но только вопрос? – Tobia

ответ

2

Нет, я уверен, что это большой эндиан.

public long readUInt(byte[] data) { 
    // If you want to tackle different lengths for little endian: 
    //data = Arrays.copyOf(data, 4); 
    return ByteBuffer.wrap(data) 
     .order(ByteOrder.LITTLE_ENDIAN) 
     .getInt() & 0xFF_FF_FF_FFL; 
} 

Вышеприведенное делает 4-байтовое (подписанное) преобразование int, а затем делает его неподписанным.

1

Correted для BigEndian

Если по DWORD вы имеете в виду 32 бит без знака INT, попробуйте это

public long readUInt(byte[] data) { 
      return (
       ((long)(data[3] & 0xFF) << 24) | 
       ((long)(data[2] & 0xFF) << 16) | 
       ((long)(data[1] & 0xFF) << 8) | 
       ((long)(data[0] & 0xFF) << 0)); 
    } 
ответ

Joop Эгген является правильным, я думаю, что это один быстрее, поскольку нет ни одного объекта распределение.

+0

Спасибо, я написал цикл, потому что я хотел быть гибким для переменной длины байта, возможно, я должен проверить, чтобы он не превышал длину. – Tobia

+0

Это большой, а не мало-endian, как Joop также упоминает в [его ответ] (http://stackoverflow.com/a/39374621/5221149). – Andreas

+1

Да, вы должны инвертировать значения сдвига – Tobia

Смежные вопросы