拆分数据并重新组合
本文关键字:组合 新组合 数据 拆分 | 更新日期: 2023-09-27 18:15:05
练习比什么都重要,真的。我对此感到非常沮丧,因为这对我来说是一个相当新的概念。我将把我的代码贴在下面。
我想做什么:
- 将文件读入字节数组
- 将字节拆分为预定义大小的部分
-
将部件组装在一起,并将文件写入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 ;
}