2009-07-23 5 views

Répondre

4

Le DataOutputStream qui écrit l'int écrit un entier de 4 octets, avec les octets hauts en premier. Lit dans char *, réinterprète et si vous avez besoin de convertir l'ordre des octets, utilisez 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

Tout va bien jusqu'à ce que vous atteigniez une plate-forme où 'sizeof (int)! = 4'. Ou un où les entiers sont ceux de complément ou de signe-un, et non le complément de deux (tous permis par ISO C99). –

+0

... ainsi que ISO C++ –

+0

Sur quelle plate-forme les entiers sont-ils complémentaires ou sign-bit? J'aimerais savoir. – anio

0

Idées:

  1. lu en binaire droite, puis convertir/octets si nécessaire interprètent. Donc, si Java a écrit 4 octets pour l'int, alors vous lisez dans 4 octets. S'il y a une quelconque chose à changer, alors faites-le, puis copiez (ou copiez) le tableau d'octets vers un C++ int
  2. Si vous pouvez changer le code Java, vous pouvez l'écrire comme quelque chose de commun que C++ peut lire comme Texte UTF-8 ou ascii, ou format de protocole Google Tampons ou autre chose.
2

La seule façon multi-plateforme pour le faire est de le lire octet par octet (qui est, par charchar), et de construire un nombre entier d'entre eux. Vous voudriez utiliser long, car int n'est pas garanti assez large pour contenir une valeur de 32 bits. Je suppose que vous avez lu les octets dans un tableau char[4] ici (autres réponses ont déjà démontré comment le faire):

char bytes[4]; 
... 
long n = (long(bytes[0]) << 24) | (long(bytes[1]) << 16) | 
     (long(bytes[2]) << 8) | long(bytes[3]) 
Questions connexes