Base58 возвращает неверное значение в эликсире - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь закодировать hex в base58.Он работает с библиотекой js base-x

с шестнадцатеричным = 1777c7ba65e23151ec09125011dd25c28998c70230e7b89ca6

Ожидаемый

base58 = AShDKgLSuCjGZr8Fs5SRLSYvmcSV7S4zwX

Получил

base58 = cAvfov2bvPACeGktuSEtz6G526UBfCwpia1354fp5bYJwP2rhhnxqYkRcwRoDrmgqZaG

defmodule Base58 do
  @alphabet '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'

  def encode(data, hash \\ "")

  def encode(data, hash) when is_binary(data) do
    encode_zeros(data) <> encode(:binary.decode_unsigned(data), hash)
  end

  def encode(0, hash), do: hash

  def encode(data, hash) do
    character = <<Enum.at(@alphabet, rem(data, 58))>>
    encode(div(data, 58), character <> hash)
  end

  defp encode_zeros(data) do
    <<Enum.at(@alphabet, 0)>>
    |> String.duplicate(leading_zeros(data))
  end

  defp leading_zeros(data) do
    :binary.bin_to_list(data)
    |> Enum.find_index(&(&1 != 0))
  end
end

1 Ответ

0 голосов
/ 19 декабря 2018

Что происходит, так это то, что входные данные должны быть порцией двоичных данных, представленных этими шестнадцатеричными цифрами, но вместо этого вы передали строку, содержащую шестнадцатеричные цифры, в Base58.encode.Вы получите ожидаемый результат, если передадите ввод в виде целого числа (используя префикс 0x, чтобы пометить его как шестнадцатеричное литеральное целое число):

iex(2)> Base58.encode("1777c7ba65e23151ec09125011dd25c28998c70230e7b89ca6")
"cAvfov2bvPACeGktuSEtz6G526UBfCwpia1354fp5bYJwP2rhhnxqYkRcvTMFJ2ouddX"
iex(3)> Base58.encode(0x1777c7ba65e23151ec09125011dd25c28998c70230e7b89ca6)
"AShDKgLSuCjGZr8Fs5SRLSYvmcSV7S4zwX"

Если у вас уже есть эти данные в строке, выможно использовать Integer.parse/2 для преобразования его в целое число:

iex(5)> with {integer, _} <- Integer.parse("1777c7ba65e23151ec09125011dd25c28998c70230e7b89ca6", 16) do
...(5)>   Base58.encode(integer)
...(5)> end
"AShDKgLSuCjGZr8Fs5SRLSYvmcSV7S4zwX"
...