在Ruby中清除所有其他位

在Ruby中清除所有其他位,ruby,bit-manipulation,Ruby,Bit Manipulation,如何在Ruby中清除字符串中的每一个字符,并将其转换为字节数组?我知道我需要对每个字节执行和操作0x01010101值。但困难在于从字符串到二进制的正确转换。理想情况下,它应该是快速的,分配量最少 稍后,我将需要将此值传递给Digest::MD5.hexdigest。您可以使用Stringbytes以十进制形式提供字符串字符的unicode值数组 “罗马”。字节[8211110997110] 您可以使用Stringbytes以十进制形式提供字符串字符的unicode值数组 “罗马”。字节[821

如何在Ruby中清除字符串中的每一个字符,并将其转换为字节数组?我知道我需要对每个字节执行和操作0x01010101值。但困难在于从字符串到二进制的正确转换。理想情况下,它应该是快速的,分配量最少

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

您可以使用Stringbytes以十进制形式提供字符串字符的unicode值数组

“罗马”。字节[8211110997110] 您可以使用Stringbytes以十进制形式提供字符串字符的unicode值数组

“罗马”。字节[8211110997110] 首先,请注意0x代表基数16,0b代表基数2:

0b11111111.to_s(2) #=> "11111111"
0x11111111.to_s(2) #=> "10001000100010001000100010001"
在转换字节内的位时,您希望使用0b。。。为了你的面具

其次,

这表明,与所有整数一样,前导零被删除,这意味着可以包含它们,也可以不包含它们。考虑,

0b11111111 & 0     #=> 0
可以看出,作为掩码,零被视为具有7个零的前导位。我们看到了

(0b11111111 &
  0b1010101).to_s(2) #=> "1010101"
因此,我们可以将您的位掩码定义为

MASK = 0b1010101
现在,我们可以使用格式字符串C*将字符串转换为8位无符号整数数组,然后使用&:

C*中的C表示格式指令C应用于第一个字符;*表示对所有后续字符重复C

另见

我从@DavidKling的回答中看出,一个人可以选择写作

str.bytes.map { |u| u & MASK }
首先,请注意0x代表基数16,0b代表基数2:

0b11111111.to_s(2) #=> "11111111"
0x11111111.to_s(2) #=> "10001000100010001000100010001"
在转换字节内的位时,您希望使用0b。。。为了你的面具

其次,

这表明,与所有整数一样,前导零被删除,这意味着可以包含它们,也可以不包含它们。考虑,

0b11111111 & 0     #=> 0
可以看出,作为掩码,零被视为具有7个零的前导位。我们看到了

(0b11111111 &
  0b1010101).to_s(2) #=> "1010101"
因此,我们可以将您的位掩码定义为

MASK = 0b1010101
现在,我们可以使用格式字符串C*将字符串转换为8位无符号整数数组,然后使用&:

C*中的C表示格式指令C应用于第一个字符;*表示对所有后续字符重复C

另见

我从@DavidKling的回答中看出,一个人可以选择写作

str.bytes.map { |u| u & MASK }

不清楚你想要什么,因为你使用的是矛盾的语言。你能解释清楚吗?使用0x01010101的AND操作肯定不同于每隔一位清除一次,它将清除八分之七的位。@David,我发现你关于保持奇数位的评论有点奇怪,它是关于使用0x的部分。。作为一个掩码,以保持每一个其他位,以及关于未能清除一位的位,考虑到每个前导零位清除相应位,即使它仅被成像。如果我错了,请告诉我。不清楚你想要什么,因为你使用的是矛盾的语言。你能解释清楚吗?使用0x01010101的AND操作肯定不同于每隔一位清除一次,它将清除八分之七的位。@David,我发现你关于保持奇数位的评论有点奇怪,它是关于使用0x的部分。。作为一个掩码,以保持每一个其他位,以及关于未能清除一位的位,考虑到每个前导零位清除相应位,即使它仅被成像。如果我错了,byte me.bytes返回原始字节值。字符串的Unicode值由返回。这恰好与ASCII rangebytes相同,返回原始字节值。字符串的Unicode值由返回。ASCII范围前导零的值恰好相同[…]您可以包含它们,也可以不包含它们–值相同,但作为读者,我发现7位二进制数字非常令人困惑。我总是写0b01010101。它还使数字对齐得更好-@Stefan,我在写支票时也会做类似的事情,但原因不同:用我的慷慨给收信人留下深刻印象。例如,$0000000.99.0百万零千零零美元和九十九个百分位数零[…]你可以包括它们,也可以不包括它们——这是相同的值,但作为一个读者,我发现一个7位二进制数字非常令人困惑。我总是写0b01010101。它还使数字对齐得更好-@Stefan,我在写支票时也会做类似的事情,但原因不同:用我的慷慨给收信人留下深刻印象。例如,0000000.99.0百万美元零仟零零美元和九十九美分