我需要合并两个二进制文件(就是把两个文件按位异或,文件A:0000111……,文件B:111000……,合并后文件C:111……),但是读出来一个字节一个字节进行合并(即两个字节异或操作c=a^b,得到新的字节c),这样文件很大,需要异或次数很多,比读文件速度还慢。各位有没有更快的方法?比如,一次异或更多的位数,而不是一个字节,本人想到的最大就是一次读出lnt64进行合并,但感觉还是很慢……

解决方案 »

  1.   

    本帖最后由 caozhy 于 2011-07-19 21:09:50 编辑
      

  2.   

    我用两个文件做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;
     }