首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于Waves平台的Ruby Base58

用于Waves平台的Ruby Base58
EN

Stack Overflow用户
提问于 2017-09-04 14:40:34
回答 1查看 119关注 0票数 1

我想为我的项目在ruby上实现波台包装器。我一开始就陷入困境,试图用文档和比特币字母表实现Base58的例子。

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

我使用BaseX宝石

代码语言:javascript
复制
num = BaseX.string_to_integer("7bWpTW", numerals: "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz")
puts bytes = [num].pack("i").inspect

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

输出与示例中的1、2、3、4、5字节数组有些相似,但我不太确定如何正确地操作字节。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-04 15:10:58

pack/unpack在这里没有多大帮助:大小未定,得到的整数可能包含许多字节(在大多数情况下也包含)。我们应该在这里编码一点:

代码语言:javascript
复制
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
# ]

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

代码语言:javascript
复制
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"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46039397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档