Ecrire int dans un tampon binary (Android) et lire avec C ++

Je veux écrire un entier dans un fichier binary avec Java (Android), puis le lire avec un code C ++. Mon code en Java est:

byte [] mybuffer = ByteBuffer.allocateDirect(4).putInt(1000).array; out.write(mybuffer, 0, 4); // out is FileOutputStream 

Le lecteur en C ++

 std::ifstream fileToRead; fileToRead.open("myFile", std::ios::binary); if (!fileToRead.is_open()){ std::cout << "[ERROR] Can't open file" << std::endl; exit(-1); } int * myInt = new int; fileToRead.read((char*)&myInt[0], 4); std::cout << " The integer is " << myInt[0] << std::endl; 

Mais j’ai des valeurs qui n’ont pas de sens.

Merci

sortie Java:

 buffer[0] = 0 buffer[1] = 0 buffer[2] = 3 buffer[3] = -24 

sortie c ++:

 The integer is -402456576 

Vous pouvez rencontrer un problème d’ordre d’octet:

 #include  #include  #include  // For ntohl with Linux (Windows has similar): #include  int main() { // You can use the constructor to open the file: std::ifstream fileToRead("myFile", std::ios::binary); // Just check the general state of the stream: if(!fileToRead){ std::cout << "[ERROR] Can't open file" << std::endl; // Please do not use exit to terminate a program: return -1; } // No need to allocate an integer. Also be specific about the size: int32_t myInt; // There might be byte order issues, here (Java is big-endian): fileToRead.read((char*)&myInt, sizeof(int32_t)); // To fix it convert the integer from network byte order to host byte order: myInt = ntohl(myInt); std::cout << " The integer is " << myInt << std::endl; } 

Pour un bon ordre, java utilise par défaut l’ordre des octets BIG_ENDIAN:

 byte[] mybuffer = ByteBuffer.allocateDirect(4) .order(Order.LITTLE_ENDIAN).putInt(1000).array(); 

C’est l’ordre sur l’architecture de la mémoire du processeur Intel.