C에서 쓴 binary file을 Java에서 읽기위해서 온갖 삽질을 하다가..
- encoding문제인가 싶어서 온갖 encoding관련 검색을 하고 변경해봤지만 이건 아니고.
- Java에서 unsigned를 다루지 못해서 생긴 문제인가 싶어서 찾아봤지만 이것도 아니고.
- Big/little endian문제였다는것을 발견...
Java에서는 Big endian으로만 데이터를 취급한다.
따라서 1) C에서 파일을 작성할때 Big endian으로 써주거나.
아니면 반대로 2) Java에서 읽을때 byte 를 거꾸로 읽어줘야 제대로 된 값을 가져올 수 있다.
나는 C에서 써주는 방법이 좀 더 간단하므로 이 방법을 택했음
1) C에서 작성하는 방법
2) Java에서 읽는 방법 ( http://www.blah-blah.ch/it/programming/java-unsigned-int/ )
- encoding문제인가 싶어서 온갖 encoding관련 검색을 하고 변경해봤지만 이건 아니고.
- Java에서 unsigned를 다루지 못해서 생긴 문제인가 싶어서 찾아봤지만 이것도 아니고.
- Big/little endian문제였다는것을 발견...
Java에서는 Big endian으로만 데이터를 취급한다.
따라서 1) C에서 파일을 작성할때 Big endian으로 써주거나.
아니면 반대로 2) Java에서 읽을때 byte 를 거꾸로 읽어줘야 제대로 된 값을 가져올 수 있다.
나는 C에서 써주는 방법이 좀 더 간단하므로 이 방법을 택했음
1) C에서 작성하는 방법
#include <arpa/inet.h>
x = htonl(x);
2) Java에서 읽는 방법 ( http://www.blah-blah.ch/it/programming/java-unsigned-int/ )
public static long readBytesLittle2Big(DataInputStream d, int iHowmany) throws IOException {
byte[] b = new byte[iHowmany];
ByteBuffer bb = ByteBuffer.allocate(iHowmany);
for (int x=0;x<iHowmany;x++)
{
b[x] = d.readByte();
}
/*Here I read stuff from disc which is saved in little endian order which I have to convert into big endian*/
for (int x=0;x<iHowmany;x++)
{
bb.put(iHowmany-1-x, b[x]);
}
bb.rewind();
return bb.getInt();
}
'Else' 카테고리의 다른 글
Repo recursive copy (0) | 2012.06.04 |
---|---|
find 사용법 (0) | 2012.02.22 |