Как преобразовать двоичный код в base10 (десятичное) целое число в эликсире
Я хотел бы иметь возможность преобразовать строку эликсира (двоичный) в целое число base10.
Я был в состоянии сделать это со следующим...
<<104, 101, 108, 108, 111>> # equal to string "hello"
|> Base.encode16()
|> Integer.parse(16)
{448378203247, ""}
Выше делает то, что я после, но, немного похоже на взломать. Я бы хотел...
- лучше понять, что именно здесь происходит
- знаю, смогу ли я сделать это за один шаг
2 ответа
Поскольку строки Elixir - это всего лишь двоичные файлы, вы можете использовать erlang :binary.decode_unsigned
функция для преобразования двоичных цифр в целые числа
Из документации http://erlang.org/doc/man/binary.html
iex> :binary.decode_unsigned("hello")
448378203247
iex> :binary.encode_unsigned(448378203247)
"hello"
По сути, значения ASCII hello
является
<<104, 101, 108, 108, 111>>
при преобразовании из десятичного в шестнадцатеричное можно записать как
<<68, 65, 6C, 6C, 6F>>
или в двоичном виде
<01101000, 01100101, 01101100, 01101100, 01101111>
который представляет собой серию байтов, хранящихся как
68656C6C6F
в шестнадцатеричном или
01101000_01100101_01101100_01101100_01101111
в двоичном
чье десятичное (основание-10) значение будет 448378203247
iex> Integer.to_string(448378203247, 16)
"68656C6C6F"
iex> Integer.to_string(448378203247, 2)
"110100001100101011011000110110001101111"
# each byte separated by _ is
# "1101000_01100101_01101100_01101100_01101111"
# missing a leading zero at the left, which doesn't change the value
редактировать: добавлен бинарный пример,
Кроме того, две шестнадцатеричные цифры могут использоваться для точного обозначения байта (4 бита, необходимых для кодирования 16 значений, от 0 до 15), поэтому, когда мы обозначаем в шестнадцатеричном виде, мы можем просто объединять шестнадцатеричные значения, а не в десятичном (база-10) нотация
Из вики для шестнадцатеричного
Шестнадцатеричные цифры широко используются разработчиками компьютерных систем и программистами, поскольку они обеспечивают более удобное для человека представление двоичных значений. Каждая шестнадцатеричная цифра представляет четыре двоичные цифры, также называемые полубайтами, которые составляют половину байта. Например, один байт может иметь значения в диапазоне от 0000 0000 до 1111 1111 в двоичной форме, что может быть более удобно представлено от 00 до FF в шестнадцатеричном формате.
Преобразуйте двоичное (с основанием 2) число в десятичное (с основанием 10) число в Эликсире:
Integer.parse("1111111", 2) |> elem(0)
дает 127
:erlang.binary_to_integer(<<"1111111">>, 2)
дает 127
Хотя это не отвечает приведенному выше примеру ОП, оно отвечает его заголовку.
Также: Elixir дает нам ярлыки в своей интерактивной консоли для преобразования двоичных, восьмеричных и шестнадцатеричных чисел в десятичные числа. Просто добавьте к своему номеру префикс
0b
если он двоичный,
0o
если он восьмеричный или
0x
если оно шестнадцатеричное, будет создан десятичный аналог.
Так
0b1111111
дает 127 в IEx.
Преобразование десятичного числа в двоичное в Эликсире:
Integer.to_string(127, 2)
дает "1111111"