2012-06-26 3 views
0

제어 할 수없는 특정 파일 형식의 파일 저장 및로드 함수를 작성 중이며 특정 바이트 위치에 해당 형식을 지정하기 위해 4 바이트의 데이터를 써야합니다 32 비트 부호없는 값 ... 내 테스트 파일에서이 값은 16052, 또는 0x00003EB4 ... 그래서 나는이 방식으로 저장 될 바이트 배열에 데이터 쓰기 :Java에서 부호없는 변수에 대한 작업

data[index] = 0xB4; 
data[index+1] = 0x3E; 
data[index+2] = 0x00; 
data[index+3] = 0x00; 

당신은 데이터를 볼 수 있습니다 리틀 엔디 언 형식입니다. 올바른지 ... 문제는 파일로드 기능을 사용하여이 데이터를로드하려고 할 때 Java가 데이터를 다음과 같이 보는 것입니다.

-76, 62, 0, 0

바이트가 java로 서명 되었기 때문에 0xB4 값이 -76으로 해석되고 있습니다. 다음 코드를 사용하여이 4 바이트를 하나의 32 비트 값으로 재구성하려고 시도하면 값이 -76으로 끝납니다.

value = data[index+3]; 
value <<= 8; 
value |= data[index+2]; 
value <<= 8; 
value |= data[index+1]; 
value <<= 8; 
value |= data[index]; 

이것이해야 할 것은 다음과 같다 : 0 × 00 행 설정 값 (상위 바이트), 시프트 시프트 8 하부에 0x3E를 8 비트 좌, 8 비트 또는 하위 8 비트 상 0x00으로 남아 비트, 왼쪽 8 비트 또는 0xB4 (하위 바이트)를 하위 8 비트로 시프트합니다.

이 값은 0x00003EB4 ...라는 값을 만들어야합니다 ... 어떤 이유로 시작했는데, 그 이유는 그 작업 후에 -76이라는 값이 나에게 있음을 알 수 없습니다. 나는이 값 -76 비트 OR 연산을 속이고있다으로 0xB4 바이트의 자바의 해석 때문이다 확신

...

내 질문에 내가이 문제를 얻기 위해 무엇을해야합니까?

감사합니다.

+0

가능한 복제본 [모든 Java 바이트가 서명된다는 사실을 해결하는 가장 좋은 방법은 무엇입니까?] (http://stackoverflow.com/questions/11088/what-is-the-best-way-to- work-around-the-fact-that-all-java-bytes-are-signed) –

+0

추가 정보, 값을 재구성하는 마지막 작업에서 중단 점을 넣으면 (값 | = 데이터 [인덱스];) "value"변수의 값은 15872이고 0x00003E00 ... 이는 정확하고 정확하게 예상 한 것입니다. 최종 중단 점이 설정되어있는 마지막 작업은 비트 OR 또는 해당 값의 하위 바이트에 값 0xB4가 있어야합니다.하지만 그렇게하지는 않습니다. 마지막 작업을 실행하기 위해 한 번 실행 한 후 "value"변수의 값은 -76입니다. 이것이 문제입니다. – CHollman82

답변

3

바이트를로드하면 서명됩니다. 그들이 정수로 강요 될 때, 기호가 확장됩니다. 이 문제를 해결하기 위해 부호있는 정수의 8 LSb 만 가져 오도록 0xFF와 비트 AND를 수행 할 수 있습니다.

귀하의 경우 value |= (data[index+i])value |= (data[index+i] & 0xFF) (여기에서 i은 보유한 색인 오프셋으로 대체 됨)이어야합니다.

+0

은 아름답게 작동했으며 한 줄의 코드를 추가하지 않았습니다. 대단히 감사합니다. – CHollman82

관련 문제