2016-09-07 4 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; 
} 

인가 :

이 내가 쓴 무엇인가? DWORD에 의해 서명되지 않은 INT 32 비트를 의미하는 경우

+0

예상되는 값을 제공합니까? – Kayaman

+0

내가 테스트 한 내용에 대해서는 그렇지만이 것이 "2의 보수"인지 안전하게 이해할 수는 없습니다. – Tobia

+0

좋은 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의

위한 시도이

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)); 
    } 

윱 Eggen의 대답은, 내가 어떤 객체가 없기 때문에이 일이 빨리 생각 올바른지 배당.

+0

감사합니다. 가변 길이의 변수에 대해 유연하고 싶었 기 때문에 루프를 작성했습니다. long 길이를 초과하지 않도록 확인해야 할 수도 있습니다. – Tobia

+0

Joop도 [그의 대답] (http://stackoverflow.com/a/39374621/5221149)에서 언급했듯이, 이것은 리틀 엔디안이 아니라 빅 엔디안입니다. – Andreas

+1

예 시프트 값을 반전해야합니다. – Tobia

관련 문제