每个字节与0x71异或

7 投票
2 回答
29440 浏览
提问于 2025-04-16 12:03

我需要从一个文件里读取一个字节,然后把它和0x71进行异或运算,最后再把结果写入另一个文件。不过,当我使用下面的代码时,它只是把字节当成字符串来读取,这样进行异或运算就出问题了。

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 个回答

-2

试试这个:

my_num = int(f.read(1))

然后对存储在 my_num 里的数字进行异或运算。

18

如果你想把某些东西当作字节数组来处理,通常你会选择一个 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',这并不是一个好主意。

撰写回答