xor每个字节为0x71

时间:2011-02-18 04:50:28

标签: python hex binaryfiles

我需要从文件中读取一个字节,然后用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进行xor并随后将其写入文件吗?

2 个答案:

答案 0 :(得分:17)

如果你想把某些东西视为一个字节数组,那么通常你需要一个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',这不是一个好主意。

答案 1 :(得分:-3)

试试这个:

my_num = int(f.read(1))

然后xor存储在my_num中的数字。