Ich benutze Generator, um eine zufällige Sequenz von unsignierten __int8'ers zu machen, und dann schreibe sie in Datei mit ofstream.write() mit dieser Methode;Wie liest und schreibt man unsigniertes __int8-Array in Binärdatei mit Filestream in C++
void CDataGenerator::GenerateRandom(std::string outputFileName, int length, bool UseEntireRange, int max) {
std::ofstream file;
file.open(outputFileName, std::ifstream::out | std::ifstream::binary);
int count = 0;
unsigned __int8* buf = new unsigned __int8[length];
while (count < length-1) {
int number = 0;
if (UseEntireRange)
number = rand();
else {
int rnd = rand();
number = (int)((double)rnd/RAND_MAX * max);
}
int capacity = 0;
if (number == 0)
capacity = 1;
else
capacity = (int)(floor(log10(number)) + 1);
for (int i = 0; i < capacity; ++i) {
if (count >= length - 2)
break;
buf[count] = ((unsigned __int8)(number/(int)pow(10, capacity - i - 1)));
number %= (int)pow(10, capacity - i - 1);
++count;
}
++count;
buf[count] = BCD_SEPARATOR;
}
file.write((__int8*)&buf[0], length);
delete[] buf;
file.close();
}
Wo const static unsigned __int8 BCD_SEPARATOR = 0xff;
Dann versuche ich Datei zu lesen, mit der Methode folgenden
unsigned __int8* CModel::GetRawData(std::string inputFileName, int &length) {
std::ifstream file(inputFileName, std::ifstream::ate | std::ifstream::binary);
length = file.tellg();
file.close();
file.open(inputFileName, std::ifstream::in | std::ifstream::binary);
unsigned __int8* result = new unsigned __int8[length];
file.read((__int8*)&result[0], length);
file.close();
return result;
}
Im meinem Test generater schafft Sequenz wie diese 0x0 0xFF 0x5 0x6 0xFF 0x1 0x9 0xFF 0x8 0xFF aber aus dem Lesestrom bekomme ich 0x0 0xCD 0x5 0x6 0xCD 0x1 0x9 0xCD 0x8 0xCD Sequenz. Es ist offensichtlich, dass alle 0xff durch 0xcd ersetzt werden. Ist es verbunden mit (__int8 *) Casts und wie löse ich es?
Wenn man sich die Datei in einem Hex-Editor aussehen, hat es mit den richtigen Werten geschrieben worden? –
Haben Sie überprüft, ob das Lesen oder Schreiben erfolgreich war? Das * Öffnen * der Datei ist gelungen? –
Auch ich schlage vor, dass Sie die Standard-Integer-Typen mit fester Breite wie 'int8_t'from [' '] (http://en.cppreference.com/w/cpp/header/cstdint) anstelle des Compiler-spezifischen und nicht verwenden -portable '__int8'. Ich empfehle auch C-Style-Cams in C++ zu verwenden. Verwenden Sie stattdessen etwas wie "reinterpret_cast (result)". Keines dieser Dinge sollte sich jedoch auf Ihr Problem beziehen. –