我需要读取一个文件(从右到左),其读取范围可能会有所不同,在某些情况下可能是每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...
目的是对每组位进行计算。
答案 0 :(得分:4)
这是一个简短但不是那么简单的解决方案。 尽管您没有提供已经拥有的代码,但是我敢肯定您从文件中读取字符串没有困难。如果输入文件是二进制文件,则需要进行一些特殊考虑。
def string_to_bits text, chunksize = 8
StringIO.new(text.unpack('B*').first).each(chunksize).map{|chunk| chunk}
end
一些解释:String.unpack
格式化字符串,B*
的含义是按位,最高有效位在前。有关API,请参见here。它返回一个元素的数组(因此,以下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"]
[