Sehr langer String



  • Datei öffnen:

    /** Unsere eigentlichen Daten */
    struct PacketTransmission
    {
    	char *data;			// Daten an sich
    	size_t nlength;			// Dateigroeße
    };
    
    FILE *fp = fopen(pb.filename.c_str(), "rb");
    
    // Dateigroese herausbekommen
    fseek(fp, 0, SEEK_END);
    int length = ftell(fp);
    rewind(fp);
    
    if(pb.pData == NULL)
    	pb.pData = new PacketTransmission;
    
    pb.pData->nlength = length;
    
    pb.pData->data = new char[length];
    
    fread(pb.pData->data, length, 1, fp);
    
    fclose(fp);
    

    Setzen eines Strings

    void Packet::SetString(std::string strData)
    {
    	if(pb.pData == NULL)
    	{
    		pb.pData = new PacketTransmission;
    		pb.pData->data = NULL;
    	}
    
    	if(pb.pData->data == NULL)
    	{
    		pb.pData->data = new char[strData.length()];
    		pb.pData->nlength = strData.length();
    		strcpy(pb.pData->data, strData.c_str());
    	}
    	else
    	{
    		delete pb.pData->data;
    
    		pb.pData->data = new char[strData.length()];
    		pb.pData->nlength = strData.length();
    		strcpy(pb.pData->data, strData.c_str());
    	}
    }
    

    Kann es sein, dass es daran liegt, dass ich nur ein send hab, welches mehrere MB rüberschickt und dadurch Unmengen an Fehler entstehen können?



  • strcpy(pb.pData->data, strData.c_str());

    hier hast du wieder das Problem mit den 0 Bytes.
    du brauchst hier memcpy

    Das Problem ist, du hast keinen echten C String. Ein C String ist nämlich dadurch definiert, dass er mit einem 0 Byte beendet wird. Wenn du binärdaten überträgst ist das aber nicht gegeben und du musst immer die größe mitangeben.

    Warum mischst du C und C++ eigentlich so?

    PS:
    delete pb.pData->data;
    das muss
    delete [] pb.pData->data;
    lauten.



  • Shade Of Mine schrieb:

    strcpy(pb.pData->data, strData.c_str());

    hier hast du wieder das Problem mit den 0 Bytes.
    du brauchst hier memcpy

    Das Problem ist, du hast keinen echten C String. Ein C String ist nämlich dadurch definiert, dass er mit einem 0 Byte beendet wird. Wenn du binärdaten überträgst ist das aber nicht gegeben und du musst immer die größe mitangeben.

    Warum mischst du C und C++ eigentlich so?

    PS:
    delete pb.pData->data;
    das muss
    delete [] pb.pData->data;
    lauten.

    Ah nochmal ein sehr sehr großes Danke! Endlich funktioniert es!
    Das Vermischen ist eig. im Nachhinein enstanden, da ich anfangs nur C++ genutzt habe und testen wollte, ob es evtl. am fstream / string lag.

    MD5 stimmt jetzt auch komplett überein.

    Nochmal ein großer Dank an alle!


Anmelden zum Antworten