如何从 Python 中的二进制文件读取和写入 "Unicode (UTF-16 little endian)" 文本?

How to read and write "Unicode (UTF-16 little endian)" text to and from a binary file in Python?

我有一个二进制文件“x.bin”,它是一个 windows 可执行文件。

我正在尝试使用 Python 修改此可执行文件中的字符串值,在文本编辑器中查看此字符串我被告知文本编码是“Unicode (UTF-16 little endian)”我可以看到空字节环绕在字符串中的文本周围。

但是,当我尝试以 Python 的二进制模式读取此文件,然后将其转换为十六进制时,我被告知执行 [=13= 时文件中不存在十六进制] 因此无法替换任何数据。

我也无法使用 encoding="utf-16-le""r" 模式下访问文件,因为这会尝试解码数据并失败。

有没有办法在 Python 中使用 UTF-16 编码访问二进制数据?

编辑:

_hex是调用data.hex()

后的结果

我正在使用这种方法从文件中读取

with open("resources\rfreeze.bin", "rb") as f:
    data = f.read()

您的问题有点不清楚,但要编辑可执行文件,您只需将目标字节替换为另一组相同长度的字节即可。这是一个例子:

test.c - 带有嵌入式 UTF-16LE 字符串的简单程序(在 Windows 中):

#include <stdio.h>

int main() {
    wchar_t* s = L"Hello";
    printf("%S\n",s);
    return 0;
}

test.py - 用另一个字符串替换字符串

with open('test.exe','rb') as f:
    data = f.read()

target = 'Hello'.encode('utf-16le')
replacement = 'ABCDE'.encode('utf-16le')

if len(target) != len(replacement):
    raise RuntimeError('invalid replacement')

data = data.replace(target,replacement)

with open('new_test.exe','wb') as f:
    f.write(data)

演示:

C:\>cl /W4 /nologo test.c
test.c

C:\>test.exe
Hello

C:\>test.py

C:\>new_test.exe
ABCDE