清除Ruby中的所有其他内容

时间:2019-04-25 18:33:21

标签: ruby bit-manipulation

如何在Ruby中清除其他所有字符串,然后将其转换为字节数组?我了解我需要对每个字节使用0x01010101值进行AND操作。但是困难在于如何正确地将字符串转换为二进制。理想情况下,它应该快速并且分配的数量最少。

稍后我将需要将此值传递给Digest::MD5.hexdigest

2 个答案:

答案 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]