2つのバイナリファイルのビットごとのOR

2つのバイナリファイルのビットごとのOR

しばらく前に、死んでいるハードドライブに対して2回の回復を試みました。まず、そのドライブを実行(GNU)ddrescueしてからdd手動で直接検索しました。私は両方の画像を最大限に活用したいと思いました。ファイルの空の部分はゼロなので、ビットごとのANDは2つのファイルをマージするのに十分です。

両方の入力ファイルのORファイルを生成するユーティリティはありますか?

(私はArchLinuxを使用していますが、リポジトリにない場合はソースからインストールします)

ベストアンサー1

これを行うことができるユーティリティはありませんが、それを行うプログラムを書くのは簡単です。以下はPythonのスケルトンの例です。

#!/usr/bin/env python
f=open("/path/to/image1","rb")
g=open("/path/to/image2","rb")
h=open("/path/to/imageMerge","wb") #Output file
while True:
     data1=f.read(1) #Read a byte
     data2=g.read(1) #Read a byte
     if (data1 and data2): #Check that neither file has ended
          h.write(chr(ord(data1) | ord(data2))) #Or the bytes
     elif (data1): #If image1 is longer, clean up
          h.write(data1) 
          data1=f.read()
          h.write(data1)
          break
     elif (data2): #If image2 is longer, clean up
          h.write(data2)
          data2=g.read()
          h.write(data2)
          break
     else: #No cleanup needed if images are same length
          break
f.close()
g.close() 
h.close()

または、より速く実行されるCプログラム(ただし、目立たないバグがある可能性が高い):

#include <stdio.h>
#include <string.h>

#define BS 1024

int main() {
    FILE *f1,*f2,*fout;
    size_t bs1,bs2;
    f1=fopen("image1","r");
    f2=fopen("image2","r");
    fout=fopen("imageMerge","w");
    if(!(f1 && f2 && fout))
        return 1;
    char buffer1[BS];
    char buffer2[BS];
    char bufferout[BS];
    while(1) {
        bs1=fread(buffer1,1,BS,f1); //Read files to buffers, BS bytes at a time
        bs2=fread(buffer2,1,BS,f2);
        size_t x;
        for(x=0;bs1 && bs2;--bs1,--bs2,++x) //If we have data in both, 
            bufferout[x]=buffer1[x] | buffer2[x]; //write OR of the two to output buffer
        memcpy(bufferout+x,buffer1+x,bs1); //If bs1 is longer, copy the rest to the output buffer
        memcpy(bufferout+x,buffer2+x,bs2); //If bs2 is longer, copy the rest to the output buffer
        x+=bs1+bs2;
        fwrite(bufferout,1,x,fout);
        if(x!=BS)
            break;
    }
}

おすすめ記事