어떻게해야할까요? 또한, 그것을 할 수있는 쉬운 방법이 있습니까? Boost 같은 것을 사용합니까?C++에서 java의 writeInt 메소드로 작성한 파일에서 int를 읽으시겠습니까?
답변
int를 쓰는 DataOutputStream은 4 바이트 정수를 쓰고 상위 바이트를 먼저 씁니다. char *로 읽어 들여, reinterpret 그리고 바이트 순서를 변환해야한다면 ntohl을 사용하십시오.
ifstream is;
is.open ("test.txt", ios::binary);
char* pBuffer = new char[4];
is.read (pBuffer, 4);
is.close();
int* pInt = reinterpret_cast<int*>(pBuffer);
int myInt = ntohl(*pInt); // This is only required if you are on a little endian box
delete [] pBuffer;
'sizeof (int)! = 4' 플랫폼을 치기 전까지는 모든게 좋고 좋아요. 또는 정수가 1의 보수 또는 부호 비트이고 2의 보수가 아닌 정수 (모두 ISO C99에서 허용). –
... ISO C++ –
뿐만 아니라 어떤 플랫폼에서 정수를 보완하거나 부호 비트를 사용합니까? 나는 알고 싶다. – anio
아이디어 :
- 이/변환 한 후, 똑바로 바이너리에 읽기 필요한 바이트를 해석한다. 따라서 Java가 int에 대해 4 바이트를 쓴다면 4 바이트를 읽습니다. 변경할 엔디안이 있다면 바이트 배열을 C++ int로 캐스팅 (또는 복사)하십시오.
- 자바 코드를 변경할 수 있다면 C++에서 읽을 수있는 일반적인 코드로 작성할 수 있습니다 UTF-8 텍스트 또는 ASCII 또는 Google 프로토콜 버퍼 형식 또는 다른 것.
그것을 할 수있는 유일한 크로스 플랫폼 방식 (즉, char
에 의해 char
이다) 그것을 바이트로 바이트를 읽고, 그들로부터 정수를 구축하는 것입니다. int
은 32 비트 값을 보유 할만큼 충분히 넓지는 않으므로 long
을 사용하려고합니다. 난 당신이 여기에 char[4]
배열에 바이트를 읽은 가정합니다 (다른 답변은 이미 증명하는 방법이) :
char bytes[4];
...
long n = (long(bytes[0]) << 24) | (long(bytes[1]) << 16) |
(long(bytes[2]) << 8) | long(bytes[3])
가능한 중복 : http://stackoverflow.com/questions/1154991/load- binary-file-using-fstream –