将一个大的byte[]数组拆分多个byte数组

luomingui 2013-10-10 01:11:30
每次发送一个4KB的包,如果byte[]较大,则会拆分为多个包,下面的循环不会写了,我用的是.net2.0的程序,在网上搜索到的都是文件传输如:http://www.cnblogs.com/chenxizhang/archive/2009/06/29/1513445.html 单这个不符合我的程序。分完之后,我还要合并的。

byte[] data
int totalLen = data.Length;
byte[] fileblock = new byte[4096];
int temp = totalLen / 4096;
for (int i = 0; i < temp; i++)
{
fileblock = new byte[4096];
Array.Copy(data, i, fileblock, 0, data.Length - 4096);
}

下面是我在其他地方搜索到的一段代码http://bbs.csdn.net/topics/330162599

var result = tm.Aggregate(new List<List<byte>>(), (container, x) =>
{
if (container.Count == 0 || x == 94)
container.Add(new List<byte>());
else
container.Last().Add(x);
return container;
})
.Select(lst => lst.ToArray());



...全文
1967 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
21213gfhgf 2016-03-07
  • 打赏
  • 举报
回复
ArraySegment
袁保康 2014-08-06
  • 打赏
  • 举报
回复
搞错了,看成java了,不能使用。
袁保康 2014-08-06
  • 打赏
  • 举报
回复
引用 5 楼 caozhy 的回复:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
            List<byte[]> splitteddata = SplitArray<byte>(data, 4);
            foreach (var item in splitteddata)
            {
                Console.WriteLine(string.Join(", ", item.Select(x => x.ToString())));
            }
            byte[] d = JoinArray<byte>(splitteddata);
            Console.WriteLine(string.Join(", ", d.Select(x => x.ToString())));
        }

        static List<T[]> SplitArray<T>(T[] data, int size)
        {
            List<T[]> list = new List<T[]>();
            for (int i = 0; i < data.Length / size; i++)
            { 
                T[] r = new T[size];
                Array.Copy(data, i * size, r, 0, size);
                list.Add(r);
            }
            if (data.Length % size != 0)
            {
                T[] r = new T[data.Length % size];
                Array.Copy(data, data.Length - data.Length % size, r, 0, data.Length % size);
                list.Add(r);
            }
            return list;
        }
        static T[] JoinArray<T>(List<T[]> arraies)
        {
            List<T> list = new List<T>();
            foreach (T[] item in arraies)
            {
                for (int i = 0; i < item.Length; i++) list.Add(item[i]);
            }
            T[] r = new T[list.Count];
            int n = 0;
            foreach (T x in list)
            {
                r[n++] = x;
            }
            return r;
        }
    }
}
1, 2, 3, 4 5, 6, 7, 8 9, 10, 11, 12 13 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 Press any key to continue . . .
相当好,同样的问题。
luomingui 2013-10-10
  • 打赏
  • 举报
回复
谢谢斑竹,结贴了。
qldsrx 2013-10-10
  • 打赏
  • 举报
回复
采用异步接收啊,不要直接UI线程里处理Socket。
threenewbee 2013-10-10
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
            List<byte[]> splitteddata = SplitArray<byte>(data, 4);
            foreach (var item in splitteddata)
            {
                Console.WriteLine(string.Join(", ", item.Select(x => x.ToString())));
            }
            byte[] d = JoinArray<byte>(splitteddata);
            Console.WriteLine(string.Join(", ", d.Select(x => x.ToString())));
        }

        static List<T[]> SplitArray<T>(T[] data, int size)
        {
            List<T[]> list = new List<T[]>();
            for (int i = 0; i < data.Length / size; i++)
            { 
                T[] r = new T[size];
                Array.Copy(data, i * size, r, 0, size);
                list.Add(r);
            }
            if (data.Length % size != 0)
            {
                T[] r = new T[data.Length % size];
                Array.Copy(data, data.Length - data.Length % size, r, 0, data.Length % size);
                list.Add(r);
            }
            return list;
        }
        static T[] JoinArray<T>(List<T[]> arraies)
        {
            List<T> list = new List<T>();
            foreach (T[] item in arraies)
            {
                for (int i = 0; i < item.Length; i++) list.Add(item[i]);
            }
            T[] r = new T[list.Count];
            int n = 0;
            foreach (T x in list)
            {
                r[n++] = x;
            }
            return r;
        }
    }
}
1, 2, 3, 4 5, 6, 7, 8 9, 10, 11, 12 13 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 Press any key to continue . . .
wangjcltj 2013-10-10
  • 打赏
  • 举报
回复
引用 3 楼 luomingui 的回复:
 public void Send ( Socket handler, byte[] data )
        {
            if (handler != null && handler.Connected)
            {
                try
                {
                    handler.Send(data);
                }
                catch
                {
                }
            }
        }
这个data数据太大,在客户端接收的时候很慢哦,导致界面上显示也很慢。 由于data太大导致从服务器发送数据到客户端很慢。不知道大家有没有解决的方法哦。
界面显示不是等接收完之后再做?数据大导致速度慢这是不可避免的。
luomingui 2013-10-10
  • 打赏
  • 举报
回复
 public void Send ( Socket handler, byte[] data )
        {
            if (handler != null && handler.Connected)
            {
                try
                {
                    handler.Send(data);
                }
                catch
                {
                }
            }
        }
这个data数据太大,在客户端接收的时候很慢哦,导致界面上显示也很慢。 由于data太大导致从服务器发送数据到客户端很慢。不知道大家有没有解决的方法哦。
jiaoshiyao 2013-10-10
  • 打赏
  • 举报
回复
给Socket自动来做不就得了
qldsrx 2013-10-10
  • 打赏
  • 举报
回复
TCP会自动拆分的,UDP应该1024字节一个包才对。

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧