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

Sam*_*Sam 1 ruby

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

[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

Car*_*and 8

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)

请参阅Array#packString#unpack

参数"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需要提取字符串的原因。

  • 也可以使用 `arr.pack("c*").unpack1("H*")` (3认同)

Dav*_*son 5

这有效:

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

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