【问题标题】:Split data and put it back together拆分数据并将其重新组合在一起
【发布时间】:2011-11-19 10:28:37
【问题描述】:

这比什么都更适合练习,真的。我对此感到最沮丧,因为这对我来说是一个相当新的概念。我将在下面发布我的代码。

我正在尝试做的事情:

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

文件“blank.exe”总是损坏。

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

我很感激,埃文

【问题讨论】:

  • 最好把你的问题留在上面,这样下一个在谷歌上搜索同样问题的人就不必问了。
  • 你原来的问题在哪里?

标签: c# split byte


【解决方案1】:

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

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

你有几个选择:

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

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

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

【讨论】:

  • 是的,我完全理解这个问题 - 但是我怎样才能重新调整数组的大小以适应所有数据呢?或者,我需要提前知道数组的大小吗?
  • 我会让其他人直接回答你的问题,因为,好吧,我不知道我脑海中的答案。但是,如果您能预先知道整个尺寸是多少,那么您就不必调整尺寸了。
  • 想通了 - Array.Resize
  • 我更新了我的答案:我不知道 Array.Resize,但它会对性能产生严重影响。来自 MSDN 文档:如果 newSize 大于旧数组的长度,则分配一个新数组并将所有元素从旧数组复制到新数组。
【解决方案2】:

就像主管技术所说的那样,您不想每次都重新创建测试数组。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      相关资源
      最近更新 更多