Ruby:如何将整数列表转换为十六进制字符串?

4

我有一个整数数组,范围从0255,每个整数代表两个十六进制数字。我想使用Ruby将此数组转换为一个十六进制字符串。该怎么做?


像这样的东西有帮助吗?https://dev59.com/iHVD5IYBdhLWcg3wHnsX?rq=1 - Antonio
arr.map { |n| n.to_s(16) }.join('') - Dave Newton
@Antonio 我看到了,但它会将像 1 这样的字符转换为 1 而不是 01,这是一个问题,因为每个元素表示两个十六进制字符。 - Cisplatin
2
arr.map { |n| sprintf('%02x', n) }.join('') - Dave Newton
...或者是@Dave的第二种变体:[0, 128, 255].each_with_object('') { |n,s| s << "%02x" % n } #=> "0080ff" 或者如果需要 => "0080FF",则使用 ..(."%02x" % n).upcase.. - Cary Swoveland
2个回答

13

使用packunpack函数(在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表示带前导零的两位数字。


如果速度很重要,那么这个答案大约比另一个答案快两倍。 - zetetic
啊,忘了那个;这肯定会更快。 - Dave Newton

4
我会这样做:

我会像这样做:

array = [0, 128, 255]
array.map { |number| number.to_s(16).rjust(2, '0') }.join
#=> "0080ff"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接