파일을 비트 시프트

파일을 비트 시프트

(이진) 파일을 읽고 인쇄하고 특정 수의 비트를 이동할 수 있는 유틸리티가 있는지 알고 싶습니다(즉, 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;
}

(간단한 알고리즘, 오류 검사 없음, 테스트 없음 등... [일반적인 주의 사항]).

관련 정보