如何将十六进制数转换'C4D81633'为带符号2的补码,即'-992471501'使用Ruby?我试过了
['C4D81633'.scan(/[0-9a-f]{2}/i).reverse.join].pack('H*').unpack('l')
Run Code Online (Sandbox Code Playgroud)
但是当我输入长度小于8个字符的输入时,上面的代码运行不正常.
否定运算符(-)已经做了两个赞美:
p (-0x1234).to_s(16) # => "-1234"
Run Code Online (Sandbox Code Playgroud)
问题在于Ruby的to_s,它注意到它被否定了,并以我们几乎总想要的方式输出 - 带有减号.
但是,如果我们掩盖了否定的值,我们将让Ruby做我们想要的事情:
p (-0x1234 & 0xffff).to_s(16) # => "edcc"
Run Code Online (Sandbox Code Playgroud)
所以让我们把它们放在一起:
def negate(n, num_bits)
mask = (1 << num_bits) - 1
-n & mask
end
def negate_string(s, num_bits)
negate(s.hex, num_bits).to_s(16)
end
p negate_string("C4D81633", 32) # "3b27e9cd"
Run Code Online (Sandbox Code Playgroud)