【问题标题】:Ruby Base58 for Waves platformWaves 平台的 Ruby Base58
【发布时间】:2017-09-04 23:28:59
【问题描述】:

我想为我的项目在 ruby​​ 上实现 Wavesplatform 包装器。 我一开始就被困住了,试图用 Base58 和比特币字母表实现 Docs 中的示例。

字符串“teststring”被编码为字节 [5, 83, 9, -20, 82, -65、120、-11]。字节 [1, 2, 3, 4, 5] 被编码为字符串“7bWpTW”。

我用BaseX gem

num = BaseX.string_to_integer("7bWpTW", numerals: "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz")
puts bytes = [num].pack("i").inspect

=> "\x05\x04\x03\x02"

输出有点类似于示例中的 [1, 2, 3, 4, 5] 字节数组,但我不确定如何正确操作字节。

【问题讨论】:

  • BaseX::Base58.string_to_integer("7bWpTW") 返回什么?
  • @mudasobwa 4328719365

标签: ruby base58


【解决方案1】:

pack/unpack 在这里不会有太大帮助:大小未确定,您获得的整数可能包含(并且在大多数情况下包含)许多字节。应该在这里写一点代码:

byte_calculator = ->(input, acc = []) do
  rem, val = input.divmod(256)
  acc << (val > 128 ? val - 256 : val)
  rem <= 0 ? acc : byte_calculator.(rem, acc)
end

byte_calculator.
  (BaseX::Base58.string_to_integer("teststring")).
  reverse
#⇒ [
#  [0] 5,
#  [1] 83,
#  [2] 9,
#  [3] -20,
#  [4] 82,
#  [5] -65,
#  [6] 120,
#  [7] -11
# ]

与逆向转换的操作方式相同:

BaseX::Base58.integer_to_string([1, 2, 3, 4, 5].
      reverse.
      each_with_index.
      reduce(0) do |acc, (e, idx)| 
  acc + e * (256 ** idx)
end)
#⇒ "7bWpTW"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2019-10-11
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多