我正在尝试生成具有特定大小的ruby文件。内容无关紧要。
这是我到目前为止所做的事情(并且有效!):
File.open("done/#{NAME}.txt", 'w') do |f|
contents = "x" * (1024*1024)
SIZE.to_i.times { f.write(contents) }
end
问题是:一旦我压缩或rar这个文件,创建的存档只有几kb小。我猜那是因为文件中的随机数据被压缩了。
如何创建更随机的数据,就好像它只是一个普通文件(例如电影文件)?具体如何:如何使用随机数据创建一个文件,该文件在存档时保持其大小?
答案 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
(例如,来自rubyzip,libarchive或seven_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]
。