Erlang двоичное представление для float & integer, несоответствие? - PullRequest
3 голосов
/ 05 июля 2011

Получен еще один запрос двоичного представления Erlang (потому что это то, что я сейчас читаю, и мне нужна реализация двоичного протокола).

Если я правильно понимаю спецификатор типа, то для значения типа "float" 8-байтовое представление выглядит нормально (это на 64-битной Win7).

1> <<A1/binary>> = <<12.3214/float>>.
<<64,40,164,142,138,113,222,106>>

Однако, что меня озадачило, так это то, что двоичное представление "целочисленного" значения типа.

2> <<A2/binary>> = <<32512/integer>>.
<<0>>
3> <<A3/binary>> = <<232512518/integer>>.
<<6>>
4> <<A5/binary>> = <<80/integer>>.
<<"P">>

Почему все они представлены в 1 байте? Может кто-нибудь объяснить это?

1 Ответ

10 голосов
/ 05 июля 2011

Вы не конвертируете термины Эрланга в их двоичное представление.Вы используете двоичный синтаксис для создания двоичных файлов.Использование целого числа обрежет их до одного байта:

3> <<255/integer>>. % Under one byte
<<"ÿ">>
4> <<256/integer>>. % "Over" one byte
<<0>>

Попробуйте:

5> term_to_binary(32512).
<<131,98,0,0,127,0>>
6> term_to_binary(232512518).
<<131,110,4,0,6,220,219,13>>
7> term_to_binary(80).
<<131,97,80>>

131 - номер версии, 97 - небольшое целое число (8-бит), 98 - большое целое число (32-разрядное), 110111) для целых чисел bignum.Остальные - данные для фактических чисел.

См. документацию для двоичного формата термина Erlang для получения дополнительной информации о значении байтов.

...