如何在红宝石中每隔"n"位读取文件?

  • 本文关键字:文件 读取 红宝石 ruby
  • 更新时间 :
  • 英文 :


我需要读取一个文件(从右到左(,其读取范围可能会有所不同,在某些情况下可以是每 3 位、18 位等......

怎么办?

我举个例子:

该文件是:

file : "anyway.rar"

此文件的最后 10 个十六进制是:

1A 2B DF FA 00 15 02 12 EA 1B

我想每 3 位从右到左读取一次。所以我们从二进制中的EA 1B开始:

11101010 00011011

读数为:

011 >> 011 >> 000 >> 101...

如果我想每 5 位读取一次,读数将是:

11011 >> 10000 >> 11010...

目的是对每组位进行计算。

这是一个简短但不是那么简单的解决方案。 尽管您没有提供所有就绪的代码,但我相信您从文件中读取字符串没有困难。如果输入文件是二进制文件,则必须进行一些特殊考虑。

def string_to_bits text, chunksize = 8
StringIO.new(text.unpack('B*').first).each(chunksize).map{|chunk| chunk}
end

一些解释:String.unpack格式化字符串,B*表示以位为单位,首先是最高有效位。有关 API,请参阅此处。它返回一个元素的数组(因此以下first这个字符串使用StringIO转换为可枚举的字符串,它有一个each(n)方法,可以将字符串切成所需长度的块。我们使用 map 将枚举器转换回数组。

像这样使用它

puts string_to_bits "this is my text"
#=> ["01110100", "01101000", "01101001", "01110011", "00100000", "01101001", "01110011", "00100000", "01101101", "01111001", "00100000", "01110100", "01100101", "01111000", "01110100"]

puts string_to_bits "this is my text", 3
#=> ["011", "101", "000", "110", "100", "001", "101", "001", "011", "100", "110", "010", "000", "001", "101", "001", "011", "100", "110", "010", "000", "001", "101", "101", "011", "110", "010", "010", "000", "001", "110", "100", "011", "001", "010", "111", "100", "001", "110", "100"]

[

最新更新