如何将二进制文件读入数组

时间:2016-07-21 04:44:51

标签: file encryption lua binary load

假设我有一个90兆字节的文件。它没有加密,但它是二进制的。

我想将此文件作为字节值数组存储到表中,以便我可以逐字节处理文件。

我可以节省2 GB的内存,因此需要记下已处理的字节,尚未处理的字节以及处理过的字节等内容都很好。我并不关心处理过程需要多长时间。

我该如何处理?

2 个答案:

答案 0 :(得分:1)

注意由于Egor的评论,我已经扩展并重写了这个答案。

首先需要以二进制模式打开文件。区别在Windows上很重要,默认文本模式会将行结尾从CR + LF更改为C换行符。您可以通过为io.open的{​​{1}}指定模式参数来执行此操作。

虽然您可以一次读取一个字节的文件,但实际上您需要在缓冲区中处理该文件。这些缓冲区可能相当大,但除非您知道只处理一次性脚本中的小文件,否则应避免将整个文件读入"rb"的缓冲区,因为这会导致非常大的文件出现各种问题

在二进制模式下打开文件后,使用file:read"*a"读取一大块文件,其中buffer = file:read(n)是块中的整数字节数。使用两个中等大小的功率可能是最有效的。返回值可以是n,也可以是最多nil个字节的字符串。如果长度小于n个字节,那么这是文件中的最后一个缓冲区。 (但是,如果从套接字,管道或终端读取,则读取少于n可能只表示尚未到达任何数据,具体取决于要在此句中解释的许多其他因素。)

n中的字符串可以通过多种方式处理。只要buffer不是太大,那么#buffer将为缓冲区中的每个字节返回一个整数字节值数组。太大部分取决于您的Lua副本在构建时的配置方式,并且可能还取决于其他因素,例如可用内存。 {buffer:byte(1,-1)}当然太大了。在下面的示例中,我使用#buffer > 1E6一次访问一个字节。这适用于任何大小的缓冲区,至少只要buffer:byte(i)保持整数。

最后,不要忘记关闭文件。

这是一个完整的例子,经过轻微测试。它一次读取一个缓冲区文件,并累计总大小和所有字节的总和。然后打印大小,总和和平均字节值。

i

使用示例作为输入在我的Windows机器上运行Lua 5.1.4,它会报告:

length: 402
sum:    30374
mean:   75.557213930348

答案 1 :(得分:0)

要将字符串s的内容拆分为字节数组,请使用{s:byte(1,-1)}