안드로이드 개발 질문/답변
(글 수 45,052)
가령 255라는 숫자가 저장된 int형 변수를 파일에 저장했다고 가정합니다.
그럼 파일에는 0xff, 0x00, 0x00, 0x00 순으로 저장이 되는데요.
안드로이드에서 이걸 읽어들이는거까진 성공했는데 int형으로 변환하려니 도저히 되질 않네요.
비트 연산을 이용했는데 당최 되질 않습니다.
byte temp[] = new byte [4];
temp[0] = (byte)0xff;
temp[1] = (byte)0x00;
temp[2] = (byte)0x00;
temp[3] = (byte)0x00;
int val = ((int)temp[0]) | ((int)temp[1] << 8) | ((int)temp[2] << 16) | ((int)temp[3] << 24);
이렇게 했을때 val에 255가 들어가야 정상인데요.
적어도 윈도우에선 그렇게 나오거든요.
그런데 안드로이드에선 도통 어떻게 해야 하는지 모르겠네요.
도움의 손길을 간절히 기다립니다.
그럼 파일에는 0xff, 0x00, 0x00, 0x00 순으로 저장이 되는데요.
안드로이드에서 이걸 읽어들이는거까진 성공했는데 int형으로 변환하려니 도저히 되질 않네요.
비트 연산을 이용했는데 당최 되질 않습니다.
byte temp[] = new byte [4];
temp[0] = (byte)0xff;
temp[1] = (byte)0x00;
temp[2] = (byte)0x00;
temp[3] = (byte)0x00;
int val = ((int)temp[0]) | ((int)temp[1] << 8) | ((int)temp[2] << 16) | ((int)temp[3] << 24);
이렇게 했을때 val에 255가 들어가야 정상인데요.
적어도 윈도우에선 그렇게 나오거든요.
그런데 안드로이드에선 도통 어떻게 해야 하는지 모르겠네요.
도움의 손길을 간절히 기다립니다.
2011.01.26 20:52:53
파일 스트림에서 int형 데이터를 읽을 수 있다면 훨씬 간단한데 이런 기능이 없는거 같더군요. 이진 파일은 무조건 byte 배열에 불러온 후에 파싱해서 사용하는거 같아서요. 아니면 *(int *)&byte[0] 이런 식으로 포인터 주소를 이용한 형 변환만 되더라도 간편하게 해결되는데 자바에선 어떻게 해야하는지 도무지 모르겠네요.
2011.01.26 22:14:00
자바에서 쓰고 자바에서 읽는다면 ObjectInputStream 과 ObjectOutputStream 으로 가능합니다. 또한 serialize 구현을 통해서 객체를 통째로 읽고 쓸수 있습니다. 자바에서 읽고 쓰는게 아니라면 위에 작성하신 방법대로 하셔야 할듯하네요.
int val = temp[3] << 24) + ((temp[2] & 0xFF) << 16) + ((temp[1] & 0xFF) << 8) + (temp[0] & 0xFF);
이런식으로 하면 될듯한데 환경에 따라 ByteOrder 가 다를수 있으니 그부분은 확인해보세요.
int val = temp[3] << 24) + ((temp[2] & 0xFF) << 16) + ((temp[1] & 0xFF) << 8) + (temp[0] & 0xFF);
이런식으로 하면 될듯한데 환경에 따라 ByteOrder 가 다를수 있으니 그부분은 확인해보세요.
2011.01.26 22:17:21
보수변환에 의해 0xff가 들어갔을때 10진수 값으로 -1이 되버려 생기는 문제 같은데요 확인해보세요
즉 저위에 코드대로라면 (int) temp[0]에서 이미 정수형 값으로 변경되면서 -1이 들어가기때문에 맨앞의 비트값이 1이 되고 나머지 부분이 0으로 채워짐으로서 생기는 값이상 같습니다.
이럴땐 byte가 1byte 즉 8비트이므로 11111111로 & 시켜주면 될듯 합니다.
byte b = (byte) 0xff;
int val = b & 0xff;
2011.01.26 23:09:44
디버깅으로 값을 일일이 추적하고 나서야 동네가수님 말씀처럼 음수값으로 변하다는 사실을 알아냈네요. C에선 겪지 못했던 일이라 많이 당황했습니다. 비슷한 방법으로 0~255 값으로 변환하고 나서 비트 연산을 해주니 정상 작동하네요. 감사합니다. 언제나 도움을 받습니다.



