将字节数组转换为十六进制字符串

时间:2018-06-22 20:56:11

标签: ruby

我正在尝试将以下字节数组转换为十六进制;

[1, 1, 65, -50, 6, 104, -91, -70, -100, 119, -100, 123, 52, -109, -33, 45, -14, 86, -105, -97, -115, 16]

结果应该是;

010141CE0668A5BA9C779C7B3493DF2DF256979F8D10

这是我目前的尝试;

item.getProperties["Mapi-Conversation-Index"].to_a.map {|s| s.to_s(16)}.join()

但是我的输出是:010141-320668-5b-46-6477-647b34-6d-212d-e56-69-61-7310

2 个答案:

答案 0 :(得分:4)

这有效:

[1, 1, 65, -50].map { |n| '%02X' % (n & 0xFF) }.join

%02X格式说明符生成一个2个字符的十六进制数字,并用0个数字填充。 & 0xFF是将您的负数转换为人们在谈论字节值时通常使用的标准0到255范围所必需的。

答案 1 :(得分:1)

arr = [1, 1, 65, -50, 6, 104, -91, -70, -100, 119, -100, 123, 52, -109, -33, 45, -14, 86]

arr.pack("c*").unpack("H*").first
  #=> "010141ce0668a5ba9c779c7b3493df2df256"  

请参见Array#packString#unpack

"c"的参数pack指定一个8位带符号整数。 "H"的参数unpack指定“十六进制字符串(高半字节在前)”。每个指令末尾的星号表示"c"适用于arr的所有元素,"H"适用于pack产生的字符串的所有字符。

请注意

arr.pack("c*")
  #=> "\x01\x01A\xCE\x06h\xA5\xBA\x9Cw\x9C{4\x93\xDF-\xF2V"

arr.pack("c*").unpack("H*")
  #=> ["010141ce0668a5ba9c779c7b3493df2df256"]

这就是为什么需要first来提取字符串的原因。