我有一个整数数组,范围从0
到255
,每个整数代表两个十六进制数字。我想使用Ruby将此数组转换为一个十六进制字符串。该怎么做?
我有一个整数数组,范围从0
到255
,每个整数代表两个十六进制数字。我想使用Ruby将此数组转换为一个十六进制字符串。该怎么做?
使用pack
和unpack
函数(在Ruby 2.4+中也可以使用unpack1
):
[0, 128, 255].pack('C*').unpack('H*')[0]
#=> "0080ff"
[0, 128, 255].pack('C*').unpack1('H*')
#=> "0080ff"
实际的二进制十六进制字符串已经由pack('C*')
返回:[0, 128, 255].pack('C*')
#=> "\x00\x80\xFF"
unpack('H*')
将其转换回人类可读的表示形式。
一个轻量级的替代方案是通过sprintf
风格的格式化,使用String@%
接受一个数组:
'%02x%02x%02x' % [0, 128, 255]
#=> "0080ff"
x
代表十六进制数,02
表示带前导零的两位数字。
我会像这样做:
array = [0, 128, 255]
array.map { |number| number.to_s(16).rjust(2, '0') }.join
#=> "0080ff"
arr.map { |n| n.to_s(16) }.join('')
- Dave Newton1
这样的字符转换为1
而不是01
,这是一个问题,因为每个元素表示两个十六进制字符。 - Cisplatinarr.map { |n| sprintf('%02x', n) }.join('')
- Dave Newton[0, 128, 255].each_with_object('') { |n,s| s << "%02x" % n } #=> "0080ff"
或者如果需要=> "0080FF"
,则使用..(."%02x" % n).upcase..
。 - Cary Swoveland