长生不老药中的 Base58 returns 值不正确
Base58 returns incorrect value in elixir
我正在尝试将十六进制编码为 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
发生的事情是输入应该是由那些十六进制数字表示的二进制数据块,但是您将包含十六进制数字的字符串传递给了 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"
我正在尝试将十六进制编码为 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
发生的事情是输入应该是由那些十六进制数字表示的二进制数据块,但是您将包含十六进制数字的字符串传递给了 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"