首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Base58在灵丹妙药中返回不正确的值

Base58在灵丹妙药中返回不正确的值
EN

Stack Overflow用户
提问于 2018-12-19 15:34:01
回答 1查看 107关注 0票数 1

我正试图将十六进制编码到base58。它适用于js库base-x

带十六进制= 1777c7ba65e23151ec09125011dd25c28998c70230e7b89ca6

期望

base58 = AShDKgLSuCjGZr8Fs5SRLSYvmcSV7S4zwX

得到了

base58 = cAvfov2bvPACeGktuSEtz6G526UBfCwpia1354fp5bYJwP2rhhnxqYkRcwRoDrmgqZaG

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-19 15:47:03

正在发生的情况是,输入应该是由十六进制数字表示的二进制数据块,但是您将包含十六进制数字的字符串传递给Base58.encode。如果将输入传递为整数(使用0x前缀将其标记为十六进制文字整数),则得到预期的结果:

代码语言:javascript
复制
iex(2)> Base58.encode("1777c7ba65e23151ec09125011dd25c28998c70230e7b89ca6")
"cAvfov2bvPACeGktuSEtz6G526UBfCwpia1354fp5bYJwP2rhhnxqYkRcvTMFJ2ouddX"
iex(3)> Base58.encode(0x1777c7ba65e23151ec09125011dd25c28998c70230e7b89ca6)
"AShDKgLSuCjGZr8Fs5SRLSYvmcSV7S4zwX"

如果字符串中已经有此数据,则可以使用Integer.parse/2将其转换为整数:

代码语言:javascript
复制
iex(5)> with {integer, _} <- Integer.parse("1777c7ba65e23151ec09125011dd25c28998c70230e7b89ca6", 16) do
...(5)>   Base58.encode(integer)
...(5)> end
"AShDKgLSuCjGZr8Fs5SRLSYvmcSV7S4zwX"
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53854476

复制
相关文章

相似问题

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