Stream in zwei Teile splitten



  • Hallo zusammen,

    es wäre super, wenn mir jemand bei diesem Problem helfen kann, denn mir fehlen hierzu leider langsam die Ideen. Mein Problem ist nämlich folgendes:

    Ich habe eine Methode geschrieben, die einen Web-Request erzeugt und dazu die entsprechende Antwort empfängt. Die Antwort kommt zwar als ein einzelner "Stream", besteht jedoch aus einem "Klartext-Teil" und einem Binärteil. Der Teil mit dem Klartext endet auf die Zeichenfolge "---!!!". Alles was danach im Stream steht gehört zum Binärteil. Bei beiden Teile des Stream möchte ich in unterschiedliche Dateien auf der Festplatte abspeichern, jedoch bekomme ich es nicht hin, den Stream richtig zu "teilen". Es wäre toll, wenn mir hierbei jemand helfen könnte.

    Danke 🙂

    Mein bisheriger Quelltext sieht wie folgt aus:

    public static string MyWebRequest(string pstrURL)
    {
    	string strURL = pstrURL;
    	string strResponse = "";
    	Stream dataStream;
    	bool blnContent = false;
    
    	//Create a Web-Request to an URL
    	HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(strURL);
    
    	//Send Web-Request and receive a Web-Response
    	HttpWebResponse httpWebesponse = (HttpWebResponse)httpWebRequest.GetResponse();
    
    	//Receive response stream
    	Stream response = httpWebesponse.GetResponseStream();
    
    	//Set up two files to store header and content
    	FileStream fsContent = File.Create(@"c:\users[USER]\Desktop\content.abc");
    	FileStream fsHeader = File.Create(@"c:\users[USER]\Desktop\header.txt");
    
    	//for reading the response stream
    	Byte[] buffer = new Byte[32 * 1024];
    	int read = response.Read(buffer, 0, buffer.Length);
    
    	//try to split header and content and save to different files
    	while (read > 0)
    	{
    		if (blnContent == true)
    		{
    			fsContent.Write(buffer, 0, read);
    		}
    		else
    		{
    			fsHeader.Write(buffer, 0, read);
    		}
    		read = response.Read(buffer, 0, buffer.Length);
    	}
    }
    


  • mal davon ausgehend dass der Header ASCII ist:

    string temp = Encoding.ASCII.GetString(buffer);
    int pos = temp.IndexOf("---!!!") + 6; // + 6 da bei ASCII 6 Zeichen 6 Bytes sind
    
    static int findByteArray(byte[] buffer, byte[] search)
    {
        for (int i = 0; i < buffer.Length - search.Length + 1; i++)
        {
            bool found = true;
            for (int j = 0; j < search.Length; j++)
            {
                if (buffer[i+j] != search[j])
                {
                    found = false;
                    break;
                }
            }
            if (found)
                return i;
        }
        return -1;
    }
    
    int pos = findByteArray(buffer, Encoding.ASCII.GetBytes("---!!!")) + 6; // + 6 da bei ASCII 6 Zeichen 6 Bytes sind
    

    Beide Male ist pos dann die Position im Byte-Array wo der Binärteil anfängt, wenn der Header Unicode ist musst du es halt bissel anpassen.



  • Vielen Dank, das war der entscheidende Hinweis, der gefehlt hat.


Anmelden zum Antworten