拆分数据并将其重新组合在一起

时间:2011-11-19 00:55:06

标签: c# split byte

实际上,这比实践更重要。我对此感到非常沮丧,因为这对我来说是一个相当新的概念。我将在下面发布我的代码。

我正在尝试做什么:

  1. 将文件读入字节数组
  2. 将字节拆分为预定义大小的
  3. 将部件放回原处,然后将文件写入HD

    byte [] sData = File.ReadAllBytes(@“C:\ Project1.exe”); // 16,384字节

    // Split the data up here
                    int range = 8;
                    range *= 1024;
                    int pos = 0;
                    int remaining;
                    int i = 0;
                    byte[] test = null;
                    while ((remaining = sData.Length - pos) > 0)
                    {
                        byte[] block = new byte[Math.Min(remaining, range)];
                        test = new byte[block.Length + pos];
                        Array.Copy(sData, pos, test, pos, block.Length);
                        pos += block.Length;
                        i++;
                    }
    
                    File.WriteAllBytes(@"C:\blank.exe", test);
    
  4. 文件“blank.exe”总是损坏。

    有人在这看到我的错误吗?

    我很感激,Evan

3 个答案:

答案 0 :(得分:1)

您正在通过循环每次传递重新创建测试数组。

这意味着当您将测试数组写入文件的末尾时,您只需编写您处理的最后一个数据块。

您有几个选择:

1)在每次传递时调整数组大小,并将先前的数据复制到新数组中。这将是非常低效的。这与Array.Resize使用的机制相同。

2)如果您提前知道所需的阵列大小(即它与您从文件中读取的数据大小相同或文件大小的倍数),那么只需在输入之前调整阵列大小一次循环。

3)使用不同的数据结构,例如List或ArrayList。

答案 1 :(得分:0)

就像competent_tech所说,你不想每次都重新创建测试数组。

我对此并不完全确定,但为什么不将byte[] test = null;初始化为byte[] test = sData.Length;并从循环中移除test = new byte[block.Length + pos];

答案 2 :(得分:0)

也许我错过了一些东西,但是你在前面的整个文件中都在啜饮,所以你已经没有输出缓冲区需要的大小了。这么多,你应该没问题:

private static void better_copy( ushort blockSize )
{
  if ( blockSize < 1 )  throw new ArgumentOutOfRangeException("blockSize") ;

  byte[] input  = File.ReadAllBytes( @"C:\Project1.exe" );   // 16,384 bytes
  byte[] output = new byte[ input.Length] ;

  for ( int p = 0 , n = 0 ; p < input.Length ; p += n )
  {
    int octetsRemaining = input.Length - p ;

    n = ( octetsRemaining < blockSize ? octetsRemaining : blockSize ) ;

    Array.Copy( input , p , output , p , n ) ;

  }

  File.WriteAllBytes( @"C:\blank.exe" , output );

  return ;
}