问题:
已知一个byte[],现在需要按要求分割成多个byte[].
1.分割个数为n
2.分割格式为:前31个字节固定,第32~33中2个字节表示后面字节个数(short)。表述可能有点困难,请看图示:已知的byte[]格式:
|____31_____|_2_|_____x_____|____31_____|_2_|_____y_____|____31_____|_2_|_____y_____|... ...要分割成n个(此处为3个):
|____31_____|_2_|_____x_____|
|____31_____|_2_|_____y_____|
|____31_____|_2_|_____z_____|其中x,y,z的值(即长度)保存在|_2_|中,通过BitConverter.ToInt16获取。

解决方案 »

  1.   

    通过Array.Copy能够把指定起始位置和指定长度的byte复制出来
      

  2.   

    这类东西,一个常规的做法是使用结构体(struct)完成当然如果能直接用指针的话,配合struct,既直接又方便
      

  3.   

    你的意思是不知道一开始分割成几个,所以不知道新的byte[]该声明多少?
    那就用List<byte>,一直Insert就行了
      

  4.   

    using System;
    using System.Collections.Generic;
    using System.Text;namespace ConsoleApplication31
    {
        class Program
        {
            static void Main(string[] args)
            {
                List<Byte> Bytes = new List<Byte>();            Bytes.AddRange(Encoding.Default.GetBytes("31个固定值"));
                Bytes.AddRange(Encoding.Default.GetBytes("02"));
                Bytes.AddRange(Encoding.Default.GetBytes("12"));            Bytes.AddRange(Encoding.Default.GetBytes("31个固定值"));
                Bytes.AddRange(Encoding.Default.GetBytes("02"));
                Bytes.AddRange(Encoding.Default.GetBytes("34"));            Bytes.AddRange(Encoding.Default.GetBytes("31个固定值"));
                Bytes.AddRange(Encoding.Default.GetBytes("03"));
                Bytes.AddRange(Encoding.Default.GetBytes("567"));            Bytes.AddRange(Encoding.Default.GetBytes("31个固定值"));
                Bytes.AddRange(Encoding.Default.GetBytes("02"));
                Bytes.AddRange(Encoding.Default.GetBytes("89"));            Bytes.AddRange(Encoding.Default.GetBytes("31个固定值"));
                Bytes.AddRange(Encoding.Default.GetBytes("01"));
                Bytes.AddRange(Encoding.Default.GetBytes("0"));            for (int i = 0; i < Bytes.Count; )
                {
                    String S = "31个固定值";
                    i += Encoding.Default.GetByteCount("31个固定值");                int Len = Convert.ToInt32(((char)Bytes[i]).ToString() + ((char)Bytes[i + 1]).ToString(), 16); // 假设长度是16进制存放的
                    i += 2;                for (int j = i; j < i + Len; j++)
                        S += ((char)Bytes[j]).ToString();
                    i += Len;                Console.WriteLine(S);
                }
                Console.Read();
            }
        }
    }
      

  5.   

    详细思路:
    1.先把你得到的这个[]在循环外赋值给临时[]
    2.遍历[]
    3.在循环取出第一段,然后抛弃,然后把剩下的重新赋值给你的临时[]
    循环代码参考:byte[] bRecord = bRecords;
    for(int i = 0;i < iRecordsCount;i++)
    {
       int iStartIndex = 31+2 + BitCoverter.ToInt16(bRecord,31);
       byte[] bARecord = new byte[iStartIndex];
       //截取前面的[]放到一个Array里去
       ***
       
       // 获取后面的[]赋值给bRecord
    }
    这样在最后Array中就是已经分割好了的[]了!
      

  6.   

    Swanzy 彻底理解,多谢兄弟!