Auslesen einer Datei mit 0-Byte Zeichen



  • Hallo.
    Ich versuche gerade den Inhalt einer PNG-Datei auszulesen. fstream erkennt die Länge der Datei richtig, nämlich genau 7043 Zeichen. Wenn ich den Inhalt nun mit fstream::read in einen Char-Array kopiere, so wird dieser ja nur bis zum 1. Vorkommen eines 0-Byte Zeichens kopiert. strlen(str) gibt 7 aus. Also ist das erste 0 Byte Zeichen beim 6. Index was so auch stimmt. Aber wie gehe ich damit nun um? Der letzte Teil der Datei hat den Inhalt "Restrictor_Encrypted_001" den ich manuell mit Notepad++ reineditiert habe. Wenn ich nun aber das 4. letzte Zeichen ausgeben will, also den Unterstrich, kommt nur ein Null Byte Zeichen. Also str[length - 4] == '\0'. Woran liegt das? Ich dachte, dass die Strings durch Funktionen wie strlen, strcpy und strstr gekürzt werden, aber das ist wohl nicht so.

    Hier ist mein Code zum auslesen des Inhalts. Ich hoffe ihr könnt mir Tipps dazu geben.

    Validate_t CRestrictor::validate(Type_t *Type)
    {
    	this->m_pStream = new fstream(this->m_pszPath, ios::in | ios::out);
    
    	if (!this->m_pStream || !this->m_pStream->is_open())
    	{
    		return FileNotExists;
    	}
    
    	this->m_pStream->seekg(0, fstream::end);
    	this->m_iLength = this->m_pStream->tellg();
    	this->m_pStream->seekg(0, fstream::beg);
    	this->m_pszSource = new char[this->m_iLength];
    	this->m_pStream->read(this->m_pszSource, this->m_iLength);
    
    	cout << this->m_pszSource[1]; // P (stimmt)
    	cout << this->m_pszSource[this->m_iLength - 4]; // Null Byte (stimmt nicht, sollte _ sein)
    	cout << strlen(this->m_pszSource); // 7 (stimmt nicht, in echt 7043)
    
    	if (strstr(this->m_pszSource, PROT_HEADER"_"PROT_VERSION))
    	{
    		this->m_Type = *Type = Encrypted;
    		return PasswordNeeded;
    	}
    	else if (strstr(this->m_pszSource, PROT_HEADER"_"))
    	{
    		return FileOutdated;
    	}
    
    	this->m_Type = *Type = Decrypted;
    	return PasswordNeeded;
    }
    

    Gruß

    (Und bitte nicht denken dass ich hier irgendwas knacken will, ich versuche mich an einem eigenen Dateischutz ;))



  • ios::binary



  • Hi.
    Danke - so easy!
    Aber dennoch bleibt das Problem mit strstr - wie kann ich das nun Anwenden? Wenn nichts anderes üblicht bleibt kann ich ja aber selber so etwas mit einer Schleife nachbasteln, so wäre es mir aber lieber.

    Gruß



  • theliquidwave schrieb:

    Aber dennoch bleibt das Problem mit strstr - wie kann ich das nun Anwenden?

    Garnicht.
    Die Definition eines C Strings besagt nunmal dass 0 das Ende des Strings anzeigt. Ergo hast du keine C Strings und kannst also die C String Funktionen nicht verwenden.



  • Hi.
    Ok, danke dafür. Meine selbst geschrieben Funktion funktioniert auch ganz gut 🙂

    Gruß


  • Mod

    Wenn du Stringoperationen auf Zeichenketten mit Nullzeichen anwenden willst, dann nimm doch std::string.



  • Hi.
    Nein - ich bin kein Freund von std::string 😉

    Gruß



  • Nein - ich bin kein Freund von std::string 😉

    Und warum nicht, wenn man fragen darf? I wants to start a flamewar.



  • Wieso willst du strings (also Zeichenketten) für den inhalt einer PNG-Datei (also reine aten-bytes) nehmen? Ich würd eher sowas wie std::vector<unsigned char> oder ähnliches nehmen.



  • Hi.
    Ich möchte die Daten nur im String haben um später simpel mittels += Hash zu rechnen. Es ist also eine wirklich simple Lernaufgabe für mich selber.

    @ Cox: Ich mag es halt einfach nicht. "Native Typen" wie Char-Arrays gefallen mir besser.

    Gruß


  • Mod

    theliquidwave schrieb:

    Hi.
    Ich möchte die Daten nur im String haben um später simpel mittels += Hash zu rechnen. Es ist also eine wirklich simple Lernaufgabe für mich selber.

    @ Cox: Ich mag es halt einfach nicht. "Native Typen" wie Char-Arrays gefallen mir besser.

    Gruß

    Ich wiederhole mich: Du wünscht dir Stringoperationen, warum nimmst du nicht std::string?

    Das du kein Freund von std::string bist, heißt ja nur, dass du die privaten Elemente nicht benutzen darfst - aber das darf sowieso niemand. 😃



  • SeppJ schrieb:

    Das du kein Freund von std::string bist, heißt ja nur, dass du die privaten Elemente nicht benutzen darfst - aber das darf sowieso niemand. 😃

    Ich musste zwar 2mal drüber nachdenken, aber um so lustiger wars 😃



  • In der C-Standardbibliothek: str* -> mem*



  • @ LordJaxom: Wow - genial. Danke!
    @ andere: Ich möchte halt einfach nicht std::string benutzen. Auch wenn dort möglicherweise Vorteile vorhanden sind mag ich es so nun einmal lieber und funktionieren tut ja auch alles. Jedem das Seine!

    Gruß


Anmelden zum Antworten