如何通过TCP侦听器从接收的流中剪切并从中提取字符串和二进制图像?C#

问题描述

我正在通过tcp套接字从第三方软件(包括xml和2个图像)获取数据流。我对如何从中提取图像一无所知。

我将所有流数据保存在一个文本文件中,如下所示: Saved text file having full content received

我试图像下面那样剪切xml和图像并保存这些图像。但是图像显示无效或损坏,这表示我做错了。 您能帮我吗,如何提取图像。第三方没有透露太多有关数据的信息。但是从流中我可以假定它是二进制数据,并且我从字符串到字节或从字节到字符串的转换是错误的。我是第一次使用tcp监听器,请帮忙。 这是我的测试代码

if (myNetworkStream.CanRead)
{
    byte[] myReadBuffer = new byte[1024];
    StringBuilder myCompleteMessage = new StringBuilder();
    int numberOfBytesRead = 0;
    // Incoming message may be larger than the buffer size.
    do
    {
        numberOfBytesRead = myNetworkStream.Read(myReadBuffer,myReadBuffer.Length);
        myCompleteMessage.AppendFormat("{0}",Encoding.ASCII.GetString(myReadBuffer,numberOfBytesRead));
        if (numberOfBytesRead == myReadBuffer.Length)
        {
            allData.AddRange(myReadBuffer);
        }
        else if (numberOfBytesRead > 0)
        {
            allData.AddRange(myReadBuffer.Take(numberOfBytesRead));
        }
    }
    while (myNetworkStream.DataAvailable);

    // Print out the received message to the console.
    traceWrapper.Writeinformation("You received the following message : " + myCompleteMessage);
    string filepath = Path.Combine(@"C:\Temp","ReceivedFile_" + DateTime.Now.ToString().Replace("/","").Replace(".","").Replace(":","").Replace(" ","") + ".txt");
    File.WriteallText(filepath,myCompleteMessage.ToString());

    string bufferString = myCompleteMessage.ToString();
    int noofboundary = 0;
    while (!string.IsNullOrEmpty(bufferString))
    {
        if (bufferString.IndexOf("--boundary") > -1 && noofboundary == 0)//xml
        {
            bufferString = bufferString.Remove(0,bufferString.IndexOf("<ABC"));
            int startindex = bufferString.IndexOf("<ABC");
            int xmllength = bufferString.IndexOf("</ABC>")+ "</ABC>".Length;
            string xmldata = bufferString.Substring(startindex,xmllength);
            traceWrapper.WriteVerbose($" camera received xml extracted {xmldata}");
            //xml extracted..remove the 
            bufferString = bufferString.Remove(0,bufferString.IndexOf("--boundary")); // remove up to xml
            noofboundary++;
        }
        else if (bufferString.IndexOf("--boundary") > -1 && noofboundary == 1) // image1
        {
            bufferString = bufferString.Remove(0,bufferString.IndexOf("Content-ID: Picture1") + "Content-ID: Picture1".Length);
            string image1string = bufferString.Substring(0,bufferString.IndexOf("--boundary"));
            string image1path = Path.Combine(@"C:\Temp","image1_" + DateTime.Now.ToString().Replace("/","") + ".jpg");
            File.WriteallBytes(image1path,Encoding.ASCII.GetBytes(image1string));

            // xml extracted..remove the 
            bufferString = bufferString.Remove(0,bufferString.IndexOf("--boundary")); // remove up to image1
            noofboundary++;
        }
        else if (bufferString.IndexOf("--boundary") > -1 && noofboundary == 2) // detection image
        {
            bufferString = bufferString.Remove(0,bufferString.IndexOf("Content-ID: Picture2") + "Content-ID: Picture2".Length);
            string image2string = bufferString.Substring(0);
            string image2imagepath = Path.Combine(@"C:\Temp","image2" + DateTime.Now.ToString().Replace("/","") + ".jpg");
            File.WriteallBytes(image2imagepath,Encoding.ASCII.GetBytes(image2string));

            bufferString = "";
            noofboundary++;
        }
    }
}
else
{
    traceWrapper.Writeinformation("Sorry.  You cannot read from this NetworkStream.");
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)