如何高效合并二进制文件? 我需要合并两个二进制文件(就是把两个文件按位异或,文件A:0000111……,文件B:111000……,合并后文件C:111……),但是读出来一个字节一个字节进行合并(即两个字节异或操作c=a^b,得到新的字节c),这样文件很大,需要异或次数很多,比读文件速度还慢。各位有没有更快的方法?比如,一次异或更多的位数,而不是一个字节,本人想到的最大就是一次读出lnt64进行合并,但感觉还是很慢…… 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 本帖最后由 caozhy 于 2011-07-19 21:09:50 编辑 我用两个文件做MD5的时间,比把这两个文件合并时间要短? 即便每次计时,我都是读入一个字节后再开始的,也就是只计算异或时间就超过了Md5的时间了, 就算他多线程也不应该这么快把? //这是我另一个的异步读取,这样做下来发现比做MD5的时间要长, //我有三个buffer,buffer1,buffer2轮流保存读取的文件,buffer3保存最后合并的结果 // bufferNum 为当前读取文件使用的buffer编号,所有文件在string[] FileName里, public void Merge() { stopw.Start(); //开始计时,Stopwatch stopw fs1 = new FileStream(FileName[0], FileMode.Open);//读取第一个文件 buffer3 = new byte[fs1.Length]; fs1.Read(buffer3, 0, (int)fs1.Length);//保存在buffer3里,buffer3存储最后合并后的结果 fs1.Close(); fs1 = new FileStream(FileName[1], FileMode.Open);// 读取第二个文件 buffer1 = new byte[fs1.Length]; IAsyncResult iasync = fs1.BeginRead(buffer1, 0, (int)fs1.Length, null, null); fs1.EndRead(iasync); bufferNum = 1;//当前使用的buffer编号 while (remainder > 0)// 判读是否还剩文件没读,初始为文件总数-2 { if (bufferNum == 1) //当前填充的是buffer1,则往buffer2里填充 { bufferNum = 2; //设置这次填充的buffer fs1.Close(); fs1 = new FileStream(FileName[FileName.Length - remainder], FileMode.Open); buffer2 = new byte[fs1.Length]; //异步读取新文件 IAsyncResult iasync1 = fs1.BeginRead(buffer2, 0, (int)fs1.Length, null, null); //合并前面两个缓冲区文件 for (int i = 0; i <buffer1.Length; i++) { buffer3[i] = (byte)(buffer3[i] ^ buffer1[i]); } // 等待前面的读取完成 fs1.EndRead(iasync1); remainder--; } else { bufferNum = 1;//设置这次填充的buffer fs1.Close(); fs1 = new FileStream(FileName[FileName.Length - remainder], FileMode.Open); buffer1 = new byte[fs1.Length]; //异步读取新文件 IAsyncResult iasync2 = fs1.BeginRead(buffer1, 0, (int)fs1.Length, null, null); //合并前面两个缓冲区文件 for (int i = 0; i < buffer2.Length; i++) { buffer3[i] = (byte)(buffer3[i] ^ buffer2[i]); } fs1.EndRead(iasync2); remainder--; } } //合并buffer3和最后读取的文件 if (bufferNum == 1) //判断最后读取的文件存储的缓冲区编号 { for (int i = 0; i <buffer1.Length; i++) { buffer3[i] = (byte)(buffer3[i] ^ buffer1[i]); } } else { for (int i = 0; i < buffer2.Length; i++) { buffer3[i] = (byte)(buffer3[i] ^ buffer2[i]); } } stopw.Stop();// 停止计时,所有合并完成 fs1.Close(); CostTime = stopw.ElapsedMilliseconds; } access 数据库 sql语句操作 IF 10位数时 OK...等等 关于c# winform 打开chm文件 asp.net(c#)做一个简单im工具 COMBOBOX问题 TreeView的问题,搞了半天没搞好,解决立即给分啊! 关于窗口调用的问题 如何在任务管理器中隐藏一些程序? 使用套接字编程和TCP协议编程在性能和特点上有什么区别? 求大侠帮忙指点一下,用C#编写的股票组合; C#定时器和线程的问题 问一个 关于图片移动浏览的问题
//我有三个buffer,buffer1,buffer2轮流保存读取的文件,buffer3保存最后合并的结果
// bufferNum 为当前读取文件使用的buffer编号,所有文件在string[] FileName里,
public void Merge()
{
stopw.Start(); //开始计时,Stopwatch stopw
fs1 = new FileStream(FileName[0], FileMode.Open);//读取第一个文件
buffer3 = new byte[fs1.Length];
fs1.Read(buffer3, 0, (int)fs1.Length);//保存在buffer3里,buffer3存储最后合并后的结果
fs1.Close(); fs1 = new FileStream(FileName[1], FileMode.Open);// 读取第二个文件
buffer1 = new byte[fs1.Length];
IAsyncResult iasync = fs1.BeginRead(buffer1, 0, (int)fs1.Length, null, null); fs1.EndRead(iasync);
bufferNum = 1;//当前使用的buffer编号
while (remainder > 0)// 判读是否还剩文件没读,初始为文件总数-2
{
if (bufferNum == 1) //当前填充的是buffer1,则往buffer2里填充
{
bufferNum = 2; //设置这次填充的buffer
fs1.Close();
fs1 = new FileStream(FileName[FileName.Length - remainder], FileMode.Open);
buffer2 = new byte[fs1.Length];
//异步读取新文件
IAsyncResult iasync1 = fs1.BeginRead(buffer2, 0, (int)fs1.Length, null, null);
//合并前面两个缓冲区文件
for (int i = 0; i <buffer1.Length; i++)
{
buffer3[i] = (byte)(buffer3[i] ^ buffer1[i]);
}
// 等待前面的读取完成
fs1.EndRead(iasync1);
remainder--;
}
else
{
bufferNum = 1;//设置这次填充的buffer
fs1.Close();
fs1 = new FileStream(FileName[FileName.Length - remainder], FileMode.Open);
buffer1 = new byte[fs1.Length];
//异步读取新文件
IAsyncResult iasync2 = fs1.BeginRead(buffer1, 0, (int)fs1.Length, null, null);
//合并前面两个缓冲区文件
for (int i = 0; i < buffer2.Length; i++)
{
buffer3[i] = (byte)(buffer3[i] ^ buffer2[i]);
}
fs1.EndRead(iasync2);
remainder--;
}
}
//合并buffer3和最后读取的文件
if (bufferNum == 1) //判断最后读取的文件存储的缓冲区编号
{
for (int i = 0; i <buffer1.Length; i++)
{
buffer3[i] = (byte)(buffer3[i] ^ buffer1[i]);
}
}
else
{
for (int i = 0; i < buffer2.Length; i++)
{
buffer3[i] = (byte)(buffer3[i] ^ buffer2[i]);
}
}
stopw.Stop();// 停止计时,所有合并完成
fs1.Close();
CostTime = stopw.ElapsedMilliseconds;
}