(バイナリ)ファイルを読み取って印刷し、特定のビット数を移動するユーティリティがあるかどうかを知りたいです(つまり、8で割り切れない数字を許可する必要があります)。
.. 同様ですがdd
(および対応するskip
オプション)、バイト単位ではなくビット単位です。
(それがないと思い、ここで実装したい場合はCを使用してください。Pythonで書かれた独自の文字列移動関数がありますが、確かに比較的はるかに遅いです)。
ベストアンサー1
この試み:
#include <stdio.h>
#include <stdlib.h>
#define SIZE (1024*1024)
int main (int argc, char *argv[])
{
FILE *from = fopen(argv[1], "rb");
FILE *to = fopen(argv[2], "wb");
int nbits = atoi(argv[3]);
int offs_bytes = nbits/8;
int shift_bits = nbits%8;
unsigned char *buf = malloc(SIZE);
size_t res, pos, i;
for (pos=0; pos<offs_bytes; pos++)
buf[pos] = 0;
buf[pos++] = 0;
while ((res = fread(buf+pos, 1, SIZE-pos, from))) {
for (i=0; i < res; i++) {
buf[pos-1] |= (buf[pos] >> shift_bits) & 0xFF;
buf[pos] = buf[pos] << (8 - shift_bits);
pos++;
}
fwrite(buf, 1, pos-1, to);
buf[0] = buf[pos-1];
pos = 1;
}
fwrite(buf, 1, 1, to);
fclose(from); fclose(to);
return 0;
}
(簡単なアルゴリズム、エラーチェックなし、テストなしなど... [一般的な注意事項])。