如何将十进制值数组转换为 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"
我尝试了 pack
和 unpack
并且失败了:
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"
我有一个字符串数组,每一项都是一个以 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"
我尝试了 pack
和 unpack
并且失败了:
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"