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