Как преобразовать двоичный код в 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"

Другие вопросы по тегам