Concat从byte []到新的完整字节[]的剩余字节

时间:2016-06-07 20:37:50

标签: c# copy buffer bytearray

我有一个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;
   }

先谢谢你们!

2 个答案:

答案 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字节)。也许你的代码的其他部分有错误或我误解了你。如果你能为我们提供更多的背景,那将是非常有帮助的。 (我没有足够的声誉来评论你的问题所以我发布这个作为答案,抱歉)