我正在尝试将以下字节数组转换为十六进制;
[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
答案 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"
"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
来提取字符串的原因。