【问题标题】:xor each byte with 0x71将每个字节与 0x71 异或
【发布时间】:2011-02-18 04:50:27
【问题描述】:

我需要从文件中读取一个字节,将其与 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 异或然后将其写入文件吗?

【问题讨论】:

标签: python hex binaryfiles


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    试试这个:

    my_num = int(f.read(1))
    

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

    【讨论】:

    • -1 问题是如何修改字节的值。 int() 将尝试将一串数字转换为一个完全不同的数字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 2013-07-13
    相关资源
    最近更新 更多