我需要读取一个文件(从右到左(,其读取范围可能会有所不同,在某些情况下可以是每 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"]
[