Как сгенерировать 32-битное число с прямым порядком байтов в формате 0x00000001 на эрланге - PullRequest
2 голосов
/ 25 марта 2019

Мне нужно сгенерировать переменную, которая имеет следующие свойства - 32-разрядное целое число с прямым порядком байтов, инициализированное 0x00000001 (я собираюсь увеличить это число один за другим).Есть ли для этого синтаксис в эрланге?

Ответы [ 2 ]

4 голосов
/ 25 марта 2019

В Erlang обычно в программе хранятся такие числа как простые целые числа:

X = 1.

или эквивалентно, если вы хотите использовать шестнадцатеричный литерал:

X = 16#00000001.

И когда пришло время преобразовать число в двоичное представление, чтобы отправить его куда-нибудь еще, используйте битовый синтаксис:

<<X:32/big>>

Возвращает двоичный файл, содержащий четыре байта:

<<0,0,0,1>>

(Это 32-разрядное целое число с прямым порядком байтов. На самом деле по умолчанию используется значение с прямым порядком байтов, поэтому вы можете просто написать <<X:32>>. <<X:64/little>> будет 64-разрядным целым числом с прямым порядком байтов.)

С другой стороны, если вы просто хотите напечатать число в формате 0x00000001, используйте io:format с этим спецификатором формата:

io:format("0x~8.16.0b~n", [X]).

8 говорит ему использовать ширину поля8 символов, 16 указывает ему использовать основание 16 (т. Е. Шестнадцатеричное), а 0 - символ заполнения, используемый для заполнения числа до ширины поля.


Обратите внимание, чтоинкремент переменной работает по-разному в Erlang по сравнению с другими языками.Как только переменной присвоено значение, вы не можете его изменить, поэтому в итоге вы сделаете рекурсивный вызов, передав новое значение в качестве аргумента функции. Этот ответ имеет пример.

0 голосов
/ 25 марта 2019

В соответствии с документацией [1] следующий фрагмент должен генерировать 32-разрядное целое число со знаком с прямым порядком байтов.

1> I = 258.                              
258
2> B = <<I:4/little-signed-integer-unit:8>>.
<<2,1,0,0>>

И следующее должно давать большие порядковые числа:

1> I = 258.
258
2> B = <<I:4/big-signed-integer-unit:8>>.
<<0,0,1,2>>

[1] http://erlang.org/doc/programming_examples/bit_syntax.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...