2009-07-23 2 views

답변

4

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; 
+0

'sizeof (int)! = 4' 플랫폼을 치기 전까지는 모든게 좋고 좋아요. 또는 정수가 1의 보수 또는 부호 비트이고 2의 보수가 아닌 정수 (모두 ISO C99에서 허용). –

+0

... ISO C++ –

+0

뿐만 아니라 어떤 플랫폼에서 정수를 보완하거나 부호 비트를 사용합니까? 나는 알고 싶다. – anio

0

아이디어 :

  1. 이/변환 한 후, 똑바로 바이너리에 읽기 필요한 바이트를 해석한다. 따라서 Java가 int에 대해 4 바이트를 쓴다면 4 바이트를 읽습니다. 변경할 엔디안이 있다면 바이트 배열을 C++ int로 캐스팅 (또는 복사)하십시오.
  2. 자바 코드를 변경할 수 있다면 C++에서 읽을 수있는 일반적인 코드로 작성할 수 있습니다 UTF-8 텍스트 또는 ASCII 또는 Google 프로토콜 버퍼 형식 또는 다른 것.
2

그것을 할 수있는 유일한 크로스 플랫폼 방식 (즉, 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])