在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