Bytes.fromhex和int_to_字节在Ruby中的实现

2024-09-29 23:17:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python3函数,我需要用Ruby编写它,这个函数接受3个参数、2个字符串和1个数字,将它们转换成字节并获取SHA256摘要

Python代码如下所示:

number = 1
bytes_number = number.to_bytes(length=(8 + (number + (number < 0)).bit_length()) // 8, byteorder='big', signed=True) 
a = "a416985e694697e6ef8b4c0126a2e26e5491fd91257c6cb3d699350e3ab285ee"
b = "fc488dbb52f9d805e48e9289f9f0f80caa9c2713750508bdb3ab5c648d0b9579"
string_hash = hashlib.sha256(bytes.fromhex(a) + bytes.fromhex(b) +  bytes_number).hexdigest()
print(string_hash)

Python3中的输出是

1640fb7d038f3f782478e7414e65df11209860756c1464fa462b62d1ec3f9685

我一直试图在Ruby中实现同样的功能,但遇到了一些问题:

require 'digest'
number = 1
a = "a416985e694697e6ef8b4c0126a2e26e5491fd91257c6cb3d699350e3ab285ee"
b = "fc488dbb52f9d805e48e9289f9f0f80caa9c2713750508bdb3ab5c648d0b9579"
hash   = Digest::SHA256.hexdigest(a + b + number.to_s)
print hash

但是在ruby中哈希是不正确的,除此之外,我在ruby中尝试了一些pack和unpack的组合,但是我找不到正确的哈希

更新:

我使用下面的代码正确地完成了从十六进制字符串到字节的转换。数字到字节的转换也很有效,但问题是现在的填充为0。我创建了一个函数,但在某些情况下失败:

require 'digest'
number = 1
a = "a416985e694697e6ef8b4c0126a2e26e5491fd91257c6cb3d699350e3ab285ee"
b = "fc488dbb52f9d805e48e9289f9f0f80caa9c2713750508bdb3ab5c648d0b9579"
hash   = Digest::SHA256.hexdigest([a].pack("H*") + [b].pack("H*") + [add_pad(number.to_i.to_s(16))].pack("H*"))
print hash

添加键盘功能:

def add_pad(num)
    if amount.length % 2 == 0
      "00" + num
    else
      "0" + num
    end
end

但在少数情况下,这会失败,例如,如果数字设置为100,则生成的哈希值不匹配


Tags: to函数number字节bytes数字hashlength

热门问题