文件随机数据但具体大小

时间:2014-11-15 16:15:27

标签: ruby zip filesize rar

我正在尝试生成具有特定大小的ruby文件。内容无关紧要。

这是我到目前为止所做的事情(并且有效!):

File.open("done/#{NAME}.txt", 'w') do |f|
  contents = "x" * (1024*1024)
  SIZE.to_i.times { f.write(contents) }
end

问题是:一旦我压缩或rar这个文件,创建的存档只有几kb小。我猜那是因为文件中的随机数据被压缩了。

如何创建更随机的数据,就好像它只是一个普通文件(例如电影文件)?具体如何:如何使用随机数据创建一个文件,该文件在存档时保持其大小?

2 个答案:

答案 0 :(得分:3)

压缩时无法保证确切的文件大小。但是,正如您在问题中所建议的那样,完全随机数据不会压缩。

您可以使用大多数随机数生成器生成随机String。即使是简单的也能够制作难以压缩的数据,但您必须编写自己的字符串创建代码。幸运的是,Ruby带有一个内置的库,它已经有一个方便的字节生成方法,你可以在代码的变体中使用它:

require 'securerandom'
one_megabyte = 2 ** 20 # or 1024 * 1024, if you prefer

# Note use 'wb' mode to prevent problems with character encoding
File.open("done/#{NAME}.txt", 'wb') do |f|
  SIZE.to_i.times { f.write( SecureRandom.random_bytes( one_megabyte ) ) }
end

如果有的话,这个文件不会压缩太多。许多压缩器将检测到该文件,并按原样存储文件(使.zip或.rar文件略大于原始文件)。

答案 1 :(得分:0)

对于给定的字符串大小N和压缩方法c(例如,来自rubyziplibarchiveseven_zip_ruby宝石),您要查找字符串str,以便:

str.size == c(str).size == N

我怀疑你是否可以放心找到这样一个字符串,但这是一种应该接近的方式:

  • 第0步:选择一个m号码m > N

  • 第1步:生成带s个字符的随机字符串m

  • 第2步:计算str = c(str)。如果str.size <= N,请增加m并重复步骤1;否则转到第3步。

  • 第3步:返回str[0,N]

相关问题