2017-09-09 7 views
0

지도에서 위치 정보를 저장하는 파일을 작성합니다 (예 : 개체가 스폰되는 위치). 내가 파일에 바이트를 작성하고 바이트 내에서 X이있을 것, y는 내가 파일바이트에 여러 값 저장

int typeData = stream.readByte(); 
int x = typeData >> 2; 
int y = typeData & 3; 

에서 그들을 구문 분석하는 방법을 좌표이 내가 달성하고 싶은 무슨을의 예입니다. 는 내가 확실하지 않다하는이 코드는 테스트되지 않았습니다, 이것은 예를 들어 예를

outStream.writeByte((x << 2) + (y | 3)); 

, 나는이 쓰기 과정에서해야 할 것이 무엇이며 가능성이 잘못된 것입니다.

+0

2 비트로 'y'의 가능한 값은 0, 1, 2 및 3입니다. 충분합니까? 이와 같이 비트 스트링에 값을 패킹해야하는 이유가 불분명합니다. 메모리와 디스크 공간은 꽤 싸고'int'를'x'와'y' 둘 다에 할당하면 문제가 발생하지 않습니다. 여기에서 해결하고자하는 _ 문제가 무엇인지 설명해야합니다. –

+0

바이트 조작은 어셈블러 시대의 연습입니다. 오늘은 절대 할 필요가 없습니다. –

+0

필자가 읽으려고하는 파일의 일부 정보에 대한 파서 만 가지고 있으므로 필자가 그 파일에 더 많은 정보를 저장할 수 있도록 작성기를 만들고 싶습니다. 그러나이 정보를 다시 작성하는 것이 더 좋을까요? – JavaGuy

답변

1

바이트 데이터 형식이 8 비트 부호있는 2의 보수 정수임을주의하십시오. 따라서 값은 -128에서 +127까지 포함됩니다.

int 변수 (x 및 y)를 사용하여 비트 연산을 계산할 때 올바른 점은 (x << 2) + (y | 3)입니다. 그런 다음 바이트로 캐스트하거나 Java가 writeByte()를 호출 할 때 최종 단계에서만 결과를 자동으로 캐스팅하도록 할 수 있습니다.

좌표를 저장하려면 8 비트 이상이 필요합니다. 파일에 저장된 이진 데이터에 액세스하려면 표준 Java java.nio.ByteBuffer API를 사용할 때 바이트 버퍼의 초기 순서는 항상 BIG_ENDIAN입니다.

+0

나는 이걸 꺼내. writeByte ((20 << 2) + (15 <<<)) ( int data = dataIn.readByte(); int x =); // 출력 X : 20 Y : 23은 20과 15이어야합니다. – JavaGuy

+0

2를 사용하여 15를 저장할 수 없습니다 4 비트 사용 :'(20 << 4) + (15 & (1 << 4-1))'. –

+0

오, 고마워요. :) – JavaGuy