拆分数据并重新组合

本文关键字:组合 新组合 数据 拆分 | 更新日期: 2023-09-27 18:15:05

练习比什么都重要,真的。我对此感到非常沮丧,因为这对我来说是一个相当新的概念。我将把我的代码贴在下面。

我想做什么:

  1. 将文件读入字节数组
  2. 将字节拆分为预定义大小的部分
  3. 将部件组装在一起,并将文件写入HD

    byte[] sData = File.ReadAllBytes(@"C:'Project1.exe");//16384字节

    // 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);
    

文件"blank.exe"总是损坏。

有人看到我的错误了吗?

谢谢你,Evan

拆分数据并重新组合

您是在每次通过循环时重新创建测试数组。

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

你有几个选择:

1)在每次传递时调整数组大小,并将以前的数据复制到新数组中。这将是非常低效的。这和Array的机制是一样的。调整使用。

2)如果您提前知道数组的期望大小(即它与您从文件中读取的数据大小相同或文件大小的倍数),则只需在进入循环之前调整一次数组的大小。

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

就像competent_tech所说的,您不希望每次都重新创建测试数组。

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

也许我遗漏了一些东西,但是您已经在前面输入了整个文件,所以您已经不知道输出缓冲区需要多大。因此,这应该很好:

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 ;
}