我有一个TCP流进来,它填满了一个256字节[]。
从那里我处理解析出消息等的字节数组。
一旦我到达<在第一个数组中有100个字节,我想把剩余的字节添加到一个新数组然后追加新的256字节数组并继续处理,所以我不会错过消息。
public static byte[] Combine(byte[] first, byte[] second)
{
byte[] ret = new byte[first.Length + second.Length];
Buffer.BlockCopy(first, 0, ret, 0, first.Length);
Buffer.BlockCopy(second, 0, ret, first.Length, second.Length);
return ret;
}
我正在使用此功能(取自Jon Skeet的一篇文章)但是有一个问题发生在byte []不断变大。
例如,如果我有256的缓冲区[]和newbuff [] 256并将其传递给上面的函数...我得到了一个512 []的回复。
现在,如果我再次传递Combine函数,它会增加256到512并且不断增长会导致一些问题,因为我正在处理一个相当大的tcp数据源。
有关如何提高效率的任何建议?目前我已尝试使用此变体,但似乎我陷入了困境。
public static byte[] Combine(byte[] first, byte[] second, int srcOffset)
{
byte[] ret = new byte[first.Length -srcOffset + second.Length];
Buffer.BlockCopy(first, srcOffset, ret, 0, first.Length - srcOffset);
Buffer.BlockCopy(second, 0, ret, first.Length - srcOffset, second.Length);
return ret;
}
先谢谢你们!
答案 0 :(得分:1)
也许这可以简化它,你可以做类似下面的事情,我个人使用带有TCP服务器的内存流来保存所有数据并且它运行良好。
public static byte[] Combine(byte[] first, byte[] second, int srcOffset)
{
MemoryStream result = new MemoryStream();
result.Write(first, 0, first.Length);
result.Write(second, 0, srcOffset);
return result.ToArray();
}
答案 1 :(得分:1)
你的第二个功能似乎完全符合你的要求。我尝试使用这个小测试设置:
byte[] a = new byte[256];
byte[] b = new byte[256];
byte[] c = Combine(a,b, 100);
Console.WriteLine(c.Length);
结果是412,正如您所期望的那样(512字节--100个已处理字节= 412字节)。也许你的代码的其他部分有错误或我误解了你。如果你能为我们提供更多的背景,那将是非常有帮助的。 (我没有足够的声誉来评论你的问题所以我发布这个作为答案,抱歉)