在Ruby中逐字节读取二进制文件
我目前正在尝试分块读取二进制文件,到目前为止,我的解决方案是:在Ruby中逐字节读取二进制文件,ruby,parsing,Ruby,Parsing,我目前正在尝试分块读取二进制文件,到目前为止,我的解决方案是: first_portion = File.binread(replay_file, 20) second_portion = File.binread(replay_file, 24, 20) 其中,第一个数字是要读取的字节数,第二个是偏移量 我知道这很糟糕,因为File.binread每次返回后都会关闭文件。我怎样才能打开文件一次,做我想做的事,然后在完成后关闭它(但仍然使用binread) 还有一个小问题。我已经在python
first_portion = File.binread(replay_file, 20)
second_portion = File.binread(replay_file, 24, 20)
其中,第一个数字是要读取的字节数,第二个是偏移量
我知道这很糟糕,因为File.binread每次返回后都会关闭文件。我怎样才能打开文件一次,做我想做的事,然后在完成后关闭它(但仍然使用binread)
还有一个小问题。我已经在python中查看了一些这样的示例,并看到了以下内容:
UINT32 = 'uintle:32'
length = binary_file.read(UINT32)
content = binary_file.read(8 * length)
这到底是做什么的(它是如何工作的),在Ruby中会是什么样子?您可以使用和打开文件并读取块中的字节: 文件将在
结束时自动关闭
关于第二个问题,我不是Python专家,如果我错了,有人会纠正我,但在Ruby中是这样的:
length = binary_file.read(4).unpack('N').first
# 32 bits = 4 bytes
# i.e., read 4 bytes, convert to a 32 bit integer,
# fetch the first element of the array (unpack always returns an array)
content = binary_file.read(8 * length)
# pretty much verbatim
您可以在此处查看更多选项:谢谢,您帮了我很大的忙。一个简单的问题,如果我处理的是UINT64或FLOAT32,第二个答案中的第一行会发生什么变化?UINT64将是8个字节,FLOAT32将是4个字节,这就是所有的变化吗?另外,为什么首先需要?对于FLOAT32,使用'g'
,对于UINT64,使用'Q>'
。我在回答中添加了#unpack
的链接供您检查。可能是在文件结束后尝试读取。例如:“\x00\x00\x04\xD2”.unpack('N')
返回[1234]
,但是”.unpack('N')
返回[nil]
。您可以显示两次读取的字符串吗?您也可以使用字符串#unpack1而不是。unpack(…)。首先
length = binary_file.read(4).unpack('N').first
# 32 bits = 4 bytes
# i.e., read 4 bytes, convert to a 32 bit integer,
# fetch the first element of the array (unpack always returns an array)
content = binary_file.read(8 * length)
# pretty much verbatim