从二进制文件中读取以 null 结尾的文件名
Reading null-terminated filename from binary file
在 C 中,我可以读取一个 "at most 16 characters" 以 null 结尾的文件名,只需将其读入一个小缓冲区即可:
FILE *fp = fopen("file.bin", "rb");
char filename[16];
fread(filename, 1, 16, fp);
但在我的 Python 方法中,我已经采取实际剥离空字符并将其转换为 ASCII 的方法,即使这些字符实际上可能并非仅是 ASCII,因为看起来 open()
并没有不接受 b''
字符串,如果我在我的代码中使用 decode("utf-8")
可能是结果。
def read_filename(f):
return f.read(16).rstrip(b"[=11=]").decode("ascii")
有没有更多的"standard"方法来做到这一点?
您的二进制数据中嵌入了 ASCII 数据,因此您的方法是正确的。
Python 字符串不是 C 字符串。数据以 NULL 结尾在 Python 中没有区别,标准库没有方法来读取此类数据、剥离 NULL 字节并像您所做的那样解码数据。
struct
module 确实支持 写入 以 null 结尾的字符串(struct.pack()
调用中的 16s
将用空值填充输出字符串以弥补所需的长度)但在阅读时,空值留在原地。
在 C 中,我可以读取一个 "at most 16 characters" 以 null 结尾的文件名,只需将其读入一个小缓冲区即可:
FILE *fp = fopen("file.bin", "rb");
char filename[16];
fread(filename, 1, 16, fp);
但在我的 Python 方法中,我已经采取实际剥离空字符并将其转换为 ASCII 的方法,即使这些字符实际上可能并非仅是 ASCII,因为看起来 open()
并没有不接受 b''
字符串,如果我在我的代码中使用 decode("utf-8")
可能是结果。
def read_filename(f):
return f.read(16).rstrip(b"[=11=]").decode("ascii")
有没有更多的"standard"方法来做到这一点?
您的二进制数据中嵌入了 ASCII 数据,因此您的方法是正确的。
Python 字符串不是 C 字符串。数据以 NULL 结尾在 Python 中没有区别,标准库没有方法来读取此类数据、剥离 NULL 字节并像您所做的那样解码数据。
struct
module 确实支持 写入 以 null 结尾的字符串(struct.pack()
调用中的 16s
将用空值填充输出字符串以弥补所需的长度)但在阅读时,空值留在原地。