日期:2014-05-17  浏览次数:21580 次

C# 数据通讯协议中 byte[] (数组的应用)如果截取byte[]的某段byte[],或是等等的数组应用。
C# byte[] (数组的应用)如果截取byte[]的某段byte[],或是等等的数组应用。

因为我现在想设计一个对数据通讯,管理方法。

弄一个接收缓存byte[],但这样做,会有一个疑问:因为我这个byte[]缓存已经是固定的长度,如:Socket里或是Com口里接收数据的缓存,我设置了,byte[] buffer = new byte[4096];缓存大小为4096个字节,但这样,如果有些我在接收的实际内容仅有10个byte,然后后面的byte[]值都为0,我该如果把这些值都去掉,呢?

如:byte[] buffer = device.Receice();//返回byte[4096]{1,2,3,4,5,6,7,8,9,10,0,0,0,0,0,0,。。。。。。0};

这个时候,原本只要10长度的,但后面的都为0,我怎么截取我想要的那10个byte呢,(不要说判断为0的值就结果,不灵活,不方便,如果10个byte中也有0,那该方案就解决不了了。)

如果是com口通讯那更麻烦,如果设置的ReceivceBufferSize的值为:10(每次接收缓存数据长度为10个byte)。

如果接收的是大于10的,那就只能分次来接收了。

那数据判断什么时候结束,如果设计数据的缓存,接一个就保存一个(这个怎么实现,用byte[]数组肯定不方便,因为byte[]已经是固定的长度了,如果用List<byte>虽然说方便,灵活,但性能上远不如byte[]数组的,请问一下大侠们都是如果设计这个类似“网游服务器”接收数据的方法的??)

接着上面所说的com口,如果接收缓存为:10大长,而这时,要接收数据为27长度的(注:不是每次都是固定的长度,而且,不是每次都相同的内容),数据内容,如例:byte[] content = new byte[]{1,2,3,4,5,6,7,8,9,.....,27};

这时,com口肯定就要分三次都接收了。

第一次:接收了:10个byte[]{1,2,3,4,5,6,7,8,9,10};

第二次:接收了:10个byte[]{11,12,13,14,15,16,17,18,19,20};

第三次:接收了:10个byte[]{21,22,23,24,25,26,27,0,0,0};//这里因为数据缓存大小为10的,所以后面都为0值。

这个时候,我分了三次接收byte[],每次都应该如何保存在另一个大型的数据缓存呢(分包,组合包,处理的数据缓存)

如果直接保存,那也会连第三次的后面三个0值也存进去了。那就会多余,如果说该三次的值,都不是完整的,还要和其它的后面的数据组合,那怎么处理呢?

总之,太多的疑问了。不知道怎么问。

最好有DEMO,有CODE+专业的注释,就是最好的文档(教程);

------解决方案--------------------
你可以去看一下Stream基类中Read,Write方法的定义


public abstract int Read(byte[] buffer, int offset, int count);
public abstract void Write(byte[] buffer, int offset, int count);


对于Read,传入一段buffer用于读取数据的缓冲区,offset是读的偏移量,count是一次要读取的最大字节数
关键在于返回值, 返回一个int类型表示这一次读真正读了多少数据.
回到你的问题,Receive函数应该有类似的方式实现,从而你就可以知道读了到底多少数据

另外Buffer的拷贝,可以用Buffer.BlockCopy以及Array.Copy,你看了参数就会明白的


------解决方案--------------------
如果是Socket之类的类,Receive方法的返回值就代表了已接收的数据字节数。
根据这个返回值就可以确定缓冲区的有效数据,至于其他的,不理就是了。
------解决方案--------------------
@sp1234
顶一个, 先学会基础的类库,再说高深的知识。

@楼主
貌似Array类里面有你想要的
------解决方案--------------------
不管是从socket还是com口读取数据,都会返回一个实际返回长度的值,有了这个值,就直接从你的byte[]读取就ok了。
------解决方案--------------------
他们告诉你每个包是10byte,那就按10byte来接收,否则也无法分割数据包。
实际上如果有不等于10byte的,那就是他们提供的通信协议不完整,先把协议全部写出来吧,否则如何设计?
------解决方案--------------------
可以看看这篇文章
http://blog.csdn.net/wuyazhe/archive/2010/05/27/5627253.aspx