xor каждый байт с 0x71 - PullRequest
       7

xor каждый байт с 0x71

6 голосов
/ 18 февраля 2011

Мне нужно было прочитать байт из файла, скопировать его с 0x71 и записать обратно в другой файл.Однако, когда я использую следующее, он просто читает байт как строку, поэтому xoring создает проблемы.

f = open('a.out', 'r')
f.read(1)

Так что я в конечном итоге сделал то же самое в C.

#include <stdio.h>
int main() {
  char buffer[1] = {0};
  FILE *fp = fopen("blah", "rb");
  FILE *gp = fopen("a.out", "wb");
  if(fp==NULL) printf("ERROR OPENING FILE\n");
  int rc;
  while((rc = fgetc(fp))!=EOF) {
    printf("%x", rc ^ 0x71);
    fputc(rc ^ 0x71, gp);
  }
  return 0;
}

Может кто-нибудь сказать мне, как я могу преобразовать полученную строку, используя f.read(), в шестнадцатеричное значение, чтобы я мог переписать ее с 0x71 и затем записать в файл?

Ответы [ 2 ]

17 голосов
/ 18 февраля 2011

Если вы хотите обрабатывать что-либо как массив байтов, то обычно вам нужно bytearray, поскольку оно ведет себя как изменяемый массив байтов:

b = bytearray(open('a.out', 'rb').read())
for i in range(len(b)):
    b[i] ^= 0x71
open('b.out', 'wb').write(b)

Индексирование массива байтов возвращает целое число в диапазоне от 0x00 до 0xff, а изменение на месте позволяет избежать необходимости создавать список и снова объединять все. Также обратите внимание, что файл был открыт в двоичном виде ('rb') - в вашем примере вы используете 'r', что не очень хорошая идея.

0 голосов
/ 18 февраля 2011

Попробуйте:

my_num = int(f.read(1))

И затем xor число, сохраненное в my_num.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...