您的位置:首页 > 编程语言 > C#

c#的字符解析简单示例

2013-10-25 14:35 288 查看
一直从事c++方面的开发,进来需要使用c#做项目,项目中需要解析一段网络流,从中将图片提取出来,网络协议很简单,采用

<image,图片ID,通道1,通道2,通道3,通道4,数据长度,{jpeg数据}><image,图片ID,通道1,通道2,通道3,通道4,数据长度,{jpeg数据}>.......传输,

写了个简单类,吧jpeg数据提取处理,直接上代码

public delegate void onImageDataHandle(int id1, int id2, int id3, int id4, byte[] buffer);
public class ImageRecive
{

static public void onImageDataDefault(int id1, int id2, int id3, int id4, byte[] buffer)
{
return;
}

public onImageDataHandle onImageHandle = onImageDataDefault;
public ImageRecive(string addr,int port)
{
_addr = addr;
_port = port;

}
public void addPictrueBox(int iKey, ref System.Windows.Forms.PictureBox pictrueBox)
{
_mapPictrueBox.Add(iKey, pictrueBox);
}

public void Start()
{
_thread = new Thread(new ThreadStart(this.doWork));
_thread.IsBackground = true;
_thread.Start();

}

public void Stop()
{
_thread.Abort();
_thread.Join();
}

private string readStr2Int(ref MemoryStream ms)
{
byte[] buffer = new byte[10];
int j = 0;
for (int i = 0; i < 10;i++ )
{
byte be = (byte)ms.ReadByte();
if (be.CompareTo((byte)' ') == 0)
{
continue;
}
if (be.CompareTo((byte)',') != 0)
{
buffer[j++] = be;
}
else
{
break;
}
}
string str = System.Text.Encoding.ASCII.GetString(buffer);
str.Trim('\0');
return str;
}
private void readMemBuffer(ref MemoryStream ms,  byte[] buffer, int iSize)
{
for (int i = 0; i < iSize;i++ )
{
ms.Read(buffer, i, 1);
}
return;
}

private void receiveToBuffer(ref Socket s, byte[] buffer, int iSize)
{
int offset = 0;
while (offset < iSize)
{
int len = s.Receive(buffer, offset, iSize - offset, SocketFlags.None);
offset += len;
}
return;
}

private void doWork()
{
Socket sockClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
int debug_index = 0;
sockClient.ReceiveBufferSize = 0x0FFFFFFF;
sockClient.Connect(_addr, _port);
MemoryStream msStream = new MemoryStream();
int bufferSize = 100;
byte[] buffer = new byte[bufferSize];
int cID1 = 0, cID2 = 0, cID3 = 0, cID4 = 0;
byte[] imageStr = new byte[6];
while (!_bStop)
{
if (msStream.Length - msStream.Position < 6)
{
//int len = sockClient.Receive(buffer);
receiveToBuffer(ref sockClient, buffer, bufferSize);
Int64 pos = msStream.Position;
msStream.Seek(0, SeekOrigin.End);
msStream.Write(buffer, 0, bufferSize);
msStream.Seek(pos, SeekOrigin.Begin);
}

long rLen = msStream.Read(imageStr, 0, 6);

if (imageStr[0].CompareTo((byte)'<') == 0 &&
imageStr[1].CompareTo((byte)'i') == 0 &&
imageStr[2].CompareTo((byte)'m') == 0 &&
imageStr[3].CompareTo((byte)'a') == 0 &&
imageStr[4].CompareTo((byte)'g') == 0 &&
imageStr[5].CompareTo((byte)'e') == 0)
{
if (msStream.Length - msStream.Position < 50)
{
//int len = sockClient.Receive(buffer);
receiveToBuffer(ref sockClient, buffer, bufferSize);
Int64 pos = msStream.Position;
msStream.Seek(0, SeekOrigin.End);
msStream.Write(buffer, 0, bufferSize);
msStream.Seek(pos, SeekOrigin.Begin);
}

//image id
msStream.ReadByte();
msStream.ReadByte();

int iImageID = Int32.Parse(readStr2Int(ref msStream));
cID1 = Int32.Parse(readStr2Int(ref msStream), System.Globalization.NumberStyles.AllowHexSpecifier);
cID2 = Int32.Parse(readStr2Int(ref msStream), System.Globalization.NumberStyles.AllowHexSpecifier);
cID3 = Int32.Parse(readStr2Int(ref msStream), System.Globalization.NumberStyles.AllowHexSpecifier);
cID4 = Int32.Parse(readStr2Int(ref msStream), System.Globalization.NumberStyles.AllowHexSpecifier);
int iImageSize = Int32.Parse(readStr2Int(ref msStream)); //
msStream.ReadByte();
msStream.ReadByte();
Int64 imagePosStart = msStream.Position;
//怀疑图像长度可能不准确时,可以通过jpeg图片结束标记0xFF 0xD9 判断图像结束
//while (true)
//{
//    if (msStream.Length-msStream.Position < 10)
//    {
//        receiveToBuffer(ref sockClient, buffer, bufferSize);
//        Int64 pos = msStream.Position;
//        msStream.Seek(0, SeekOrigin.End);
//        msStream.Write(buffer, 0, bufferSize);
//        msStream.Seek(pos, SeekOrigin.Begin);
//    }
//    byte[] endBuffer = new byte[3];
//    readMemBuffer(ref msStream, endBuffer, 3);
//    //if (msStream.Position == 0x99C0)
//    //{
//    //    int debug = 0;
//    //}
//    if (endBuffer[0].CompareTo((byte)0xFF) == 0 &&
//        endBuffer[1].CompareTo((byte)0xD9) == 0 &&
//        endBuffer[2].CompareTo((byte)0x7D) == 0)  //0x7D 不是jpg结束标记,是‘}’
//    {
//        Int64 iImageEndPos = msStream.Position;
//        int imageRealSize = (int)(iImageEndPos - imagePosStart-1);
//        msStream.Seek(imagePosStart, SeekOrigin.Begin);
//        byte[] imageBuff = new byte[imageRealSize];
//        readMemBuffer(ref msStream, imageBuff, imageRealSize);
//        if (onImageHandle != null)
//        {
//            onImageHandle(cID1, cID2, cID3, cID4, imageBuff);
//        }
//        int remain = (int)(msStream.Length - msStream.Position);
//        byte[] remainBuffer = new byte[remain];
//        readMemBuffer(ref msStream, remainBuffer, remain);
//        msStream.SetLength(0);
//        msStream.Write(remainBuffer, 0, remain);
//        msStream.Seek(0, SeekOrigin.Begin);

//        break;
//    }
//    else
//    {
//        msStream.Seek(-2, SeekOrigin.Current);
//    }
//}

if (msStream.Length - msStream.Position < iImageSize)
{

int remain = iImageSize - (int)(msStream.Length - msStream.Position);
byte[] remainBuff = new byte[remain];
// int len = sockClient.Receive(remainBuff);
receiveToBuffer(ref sockClient, remainBuff, remain);
Int64 pos = msStream.Position;
msStream.Seek(0, SeekOrigin.End);
msStream.Write(remainBuff, 0, remain);
msStream.Seek(pos, SeekOrigin.Begin);

//msStream.
byte[] imageBuff = new byte[iImageSize];
readMemBuffer(ref msStream, imageBuff, iImageSize);
if (onImageHandle != null)
{
onImageHandle(cID1, cID2, cID3, cID4, imageBuff);
//Thread.Sleep(2000);
System.Diagnostics.Trace.WriteLine((debug_index++).ToString());
}
msStream.SetLength(0);
msStream.Seek(0, SeekOrigin.Begin);

// MemoryStream msImage = new MemoryStream(imageBuff);
//           System.Drawing.Image image1 = System.Drawing.Image.FromStream(msImage);
//        image1.Save("d:\\1.jpg");

}

}
else
{
msStream.Seek(-5, SeekOrigin.Current);
}

}
}
catch (System.Exception ex)
{
System.Diagnostics.Trace.WriteLine("thread exit except");
sockClient.Close();
return;
}
System.Diagnostics.Trace.WriteLine("thread exit nomal");
return;

}

private Thread _thread;
private string _addr;
private int _port;
private bool _bStop = false;
private Dictionary<int, PictureBox> _mapPictrueBox = new Dictionary<int, PictureBox>();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: