如何将十进制值数组转换为 Ruby 中的 MAC 地址?

How do I convert an array of decimal values to a MAC address in Ruby?

我有一个字符串数组,每一项都是一个以 10 为底的十进制值,需要将其转换为以 16 为底的等效值:

输入:

a = ["23", "137", "44", "30", "38", "2"]

输出:

#=> ["17", "89", "2c", "1e", "26", "02"]

理想情况下,我需要数组真正代表什么,这是一个 48 字节 MAC 地址:

#=> "17892c1e2602" or "17:89:2c:1e:26:02"

我尝试了 packunpack 并且失败了:

a.map { |i| i.to_s(16) }

结果 ArgumentError: wrong number of arguments (1 for 0)

如能提供转换帮助,我们将不胜感激。

a = ["23", "137", "44", "30", "38", "2"]

a.map(&:to_i).map { |i| i.to_s(16).rjust(2, '0') }.join ':' 
#=> "17:89:2c:1e:26:02"

UPD 正如卡里在评论中所建议的那样,在随后的两个 map 中没有必要:

a.map { |s| s.to_i.to_s(16).rjust(2, '0') }.join ':' 
#=> "17:89:2c:1e:26:02"

您可以将 Kernel#sprintf 格式与 x 字段类型一起使用:

a = ["23", "137", "44", "30", "38", "2"]

"%02x"*a.size % a
  #=> "17892c1e2602"

步骤:

"%02x"*a.size % a
  #=> "%02x"*6 % ["23", "137", "44", "30", "38", "2"]
  #   "%02x%02x%02x%02x%02x%02x" % ["23", "137", "44", "30", "38", "2"]
  #=> "17892c1e2602"

"%02x"中:

  • % 表示 sprintf 格式遵循
  • 字段类型x表示"convert argument [an integer or a string] as a hexadecimal number"
  • 2是字段宽度
  • 0 表示用零而不是空格填充

要插入冒号:

(["%02x"]*a.size).join(':') % a
  #=> "17:89:2c:1e:26:02"