如何在Ruby中清除其他所有字符串,然后将其转换为字节数组?我了解我需要对每个字节使用0x01010101值进行AND操作。但是困难在于如何正确地将字符串转换为二进制。理想情况下,它应该快速并且分配的数量最少。
稍后我将需要将此值传递给Digest::MD5.hexdigest
。
答案 0 :(得分:6)
首先,请注意,0x
用于基数16,0b
用于基数2:
0b11111111.to_s(2) #=> "11111111"
0x11111111.to_s(2) #=> "10001000100010001000100010001"
在转换字节内的位时,要使用0b...
作为掩码。
下一步
0b01010101.to_s(2) #=> "1010101"
表明,与所有整数一样,前导零被删除,这意味着您可以包含或不包含它们。考虑,
0b11111111 & 0 #=> 0
可以看出,作为掩码,零被视为具有7个零的前导位。我们看到了
(0b11111111 &
0b1010101).to_s(2) #=> "1010101"
因此,我们可以将您的按位掩码定义为
MASK = 0b1010101
我们现在可以将String#unpack与格式为"C*"
的字符串一起使用,以将字符串转换为8位无符号整数的数组,然后依次对它们进行 bit和 {{1 }}(使用MASK
):
&
str = "Let's party, now!"
str.unpack("C*").map { |u| u & MASK }
#=> [68, 69, 84, 5, 81, 0, 80, 65, 80, 84, 81, 4, 0, 68, 69, 85, 1]
中的"C"
表示格式指令"C*"
应用于第一个字符; "C"
表示对所有后续字符重复"*"
。
另请参阅Integer#&。
我从@DavidKling的回答中看到,人们可以选择写作
"C"
答案 1 :(得分:2)
您可以使用String#bytes
为您提供字符串字符的unicode值的数组(十进制)。
'Roman'.bytes # [82, 111, 109, 97, 110]