我正在尝试将以下字节数组转换为十六进制;
[1, 1, 65, -50, 6, 104, -91, -70, -100, 119, -100, 123, 52, -109, -33, 45, -14, 86, -105, -97, -115, 16]
Run Code Online (Sandbox Code Playgroud)
结果应该是;
010141CE0668A5BA9C779C7B3493DF2DF256979F8D10
Run Code Online (Sandbox Code Playgroud)
这是我目前的尝试;
item.getProperties["Mapi-Conversation-Index"].to_a.map {|s| s.to_s(16)}.join()
Run Code Online (Sandbox Code Playgroud)
但是我的输出是: 010141-320668-5b-46-6477-647b34-6d-212d-e56-69-61-7310
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"
Run Code Online (Sandbox Code Playgroud)
参数"c"forpack指定一个 8 位有符号整数。该参数"H"用于unpack指定“十六进制字符串(高字节第一)”。每个指令末尾的星号指定"c"适用于由 生成的字符串的所有元素arr和"H"所有字符pack。
注意
arr.pack("c*")
#=> "\x01\x01A\xCE\x06h\xA5\xBA\x9Cw\x9C{4\x93\xDF-\xF2V"
Run Code Online (Sandbox Code Playgroud)
和
arr.pack("c*").unpack("H*")
#=> ["010141ce0668a5ba9c779c7b3493df2df256"]
Run Code Online (Sandbox Code Playgroud)
这就是为什么first需要提取字符串的原因。
这有效:
[1, 1, 65, -50].map { |n| '%02X' % (n & 0xFF) }.join
Run Code Online (Sandbox Code Playgroud)
该%02X格式说明使一个2字符宽十六进制数,以填充0数字。在& 0xFF你的负数转换成标准的0到255范围内谈论字节值时,人们通常使用是必要的。