有几种 Select .
您可以通过to_s
将其转换为十六进制字符串,使用scan
、reverse
和join
一起提取字节,然后通过to_i
将结果转换回整数:
num = num.to_s(16) #=> "deadbeef"
.scan(/../) #=> ["de", "ad", "be", "ef"]
.reverse #=> ["ef", "be", "ad", "de"]
.join #=> "efbeadde"
.to_i(16) #=> 4022250974
或者使用正则表达式和sub
进行反转:
num = num.to_s(16) #=> "deadbeef"
.sub(/(..)(..)(..)(..)/, '\4\3\2\1') #=> "efbeadde"
.to_i(16) #=> 4022250974
或者,您可以使用掩码(&
)和位移位(<<
/>>
)将每个字节移动到其新位置:(通过|
组合)
num = (num & 0x000000FF) << 24 |
(num & 0x0000FF00) << 8 |
(num & 0x00FF0000) >> 8 |
(num & 0xFF000000) >> 24
或者,正如Rajagopalan in the comments所建议的,您可以利用Ruby的packing and unpacking方法:
num = [num].pack('L<').unpack1('L>')
L
指定32位无符号整数,<
/>
指定小端和大端.pack('L<')
将该数值转换为二进制4字节字符串"\xDE\xAD\xBE\xEF"
,并且unpack1('L>')
将该字符串数据转换回具有相反字节顺序的数字.