Mudança de bit de um arquivo

1

Gostaria de saber se existe um utilitário para ler e imprimir um arquivo (binário), deslocado por alguma quantidade de bits (quer dizer, ele deve aceitar quantidades, que não são divisíveis por 8).

.. algo como dd (e sua skip opção), mas bit-wise, em vez de byte-wise.

(Se você acha que não existe tal coisa, e vai implementá-la aqui, por favor use C .. eu tenho meu próprio bit-shifting para strings, escrito em Python, mas certamente é relativamente lento como o inferno )

    
por mykhal 14.11.2012 / 23:25

1 resposta

3

Tente isto:

#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;
}

(algoritmo simples, sem verificação de erros, mal testado, etc ... [advertências usuais]).

    
por 15.11.2012 / 12:45

Tags