2017-09-04 10 views
0

私のプロジェクトではRubyにWavesplatformラッパーを実装したいと思います。 私はすぐに、Base58とBitcoinアルファベットを使用してDocsの例を実装しようとしています。Ruby Base58 for Wavesプラットフォーム

文字列「teststring」は、バイト[5、83、9、-20、82、 -65、120、-11]にコード化されています。バイト[1,2,3,4,5]は、文字列 "7bWpTW"にコード化される。

Iは、実施例から[1、2、3、4、5]バイト配列に幾分類似出力BaseX gem

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

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

を使用し、私は適切にバイトを操作する方法は本当にわかりません。

+0

何 'BaseX :: Base58.string_to_integer( "7bWpTW")'戻っ一つはここにビットをコーディングする必要がありますか? – mudasobwa

+0

@ mudasobwa 4328719365 –

答えて

1

pack/unpackここではあまり役に立ちません。サイズは不定であり、得られる整数には多くのバイトが含まれている場合があります。 1は逆変換で動作しなければならない

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" 
関連する問題