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.