2017-09-04 14 views
0

我想爲我的項目實現Wavesplatform紅寶石包裝。 我被困在一開始,試圖用Docs與Base58和Bitcoin字母表實現示例。Ruby Base58 for Waves平臺

字符串「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]個字節從示例性陣列,但我不能肯定如何正確操作字節。

+0

什麼'BaseX :: Base58.string_to_integer( 「7bWpTW」)'回報? – mudasobwa

+0

@mudasobwa 4328719365 –

回答

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"