Bytes einlesen und vergleichen



  • Hallo,

    vorsicht Anfängerfrage *g*
    Ich möchte eine Datei Byteweise einlesen und vergleichen aber irgendwie finde ich keine Lösung, was ich bisher habe:

    Dabei sollen jeweils 2 Bytes eingelesen werden und falls diese 0xFC, 0x00 sind ersetzt werden durch 0xC3, 0xBC. Hat jemand einen Lösungsansatz für mich?

    char buffer[2];
    
    ifstream::pos_type size;
    
    ifstream combatlog ("combat.log", ios::in | ios::binary | ios::ate);
    
    	if(combatlog.is_open())
    	{
    		size = combatlog.tellg();
    		combatlog.seekg(0, ios::beg);
    		while(!combatlog.eof())
    		{
    			combatlog.read(buffer, 2);
    			if(buffer[0]=="FC" && buffer[1]=="00")
    			{
    				buffer[0] = "C3";
    				buffer[1] = "BC";
    				output.write(buffer, 2);
    			} else
    			{
    			output.write(buffer, 2);
    			}
    		}
    		combatlog.close();
    	}
    

    Schonmal Danke
    Jarmin



  • "FC" ist ein string. die hexadezimale zahl heißt 0xFC.

    if(buffer[0]==0xFC && buffer[1]==0x00)
    


  • ja habe ich auch schon versucht, bringt aber allein nicht das ersehnte Ergebnis.



  • habs mit memcmp() hinbekommen



  • Jarmin schrieb:

    ja habe ich auch schon versucht, bringt aber allein nicht das ersehnte Ergebnis.

    Den Versuche sähe ich gerne einmal (nur aus Neugier ... und natürlich inklusive dem von Dir beobachteten und ungewünschten Verhalten).

    Gruß,

    Simon2.



  • Wenn ich den von dir geposteten Code mal als Vorlage nehme...

    ifstream::pos_type size; // brauchen wir eigentlich nicht, oder?
        ifstream combatlog ("combat.log", ios::in | ios::binary | ios::ate); 
    
        if (combatlog.is_open()) 
        { 
            size = combatlog.tellg(); 
            combatlog.seekg(0, ios::beg); 
    
            char lastChar;
            combatlog.read(&lastChar, 1); 
            if (!combatlog.eof())
            {
                while(true) 
                {
                    char thisChar;
                    combatlog.read(&thisChar, 1); 
                    if (!combatlog.eof()) // eof() ist erst true nachdem ein versuch gemacht wurde ein zeichen zu lesen welches garnichtmehr da ist
                        break;            // also müssen wir auch NACH dem lesen prüfen
    
                    if (lastChar == static_cast<char>(0xFC) && thisChar == static_cast<char>(0x00)) 
                    { 
                        lastChar = 0xC3; 
                        thisChar = 0xBC; 
                    }
                    output.write(&lastChar, 1); 
                    lastChar = thisChar;
                } 
                output.write(&lastChar, 1); 
            }
            combatlog.close(); 
        }
    

Anmelden zum Antworten