Как добавить целое число в существующий двоичный файл - PullRequest
0 голосов
/ 29 августа 2018

Предположим, у меня есть двоичный файл, подобный этому <<1,2,3,4>>, и я хочу изменить его на <<1,2,3,4,5>>. Как я могу это сделать?

Кроме того, я пытаюсь преобразовать список в двоичный файл [1,2,3,4,5] => <<1,2,3,4,5>>, но я не уверен, как это сделать.

Ответы [ 4 ]

0 голосов
/ 03 сентября 2018

Я заметил, что если список содержит значения больше 255, я получение ошибки аргумента (если функция erlang) или изменение значений вызывают размер бинарных элементов по умолчанию составляет 1 байт. Как я могу преодолеть это? Это вообще возможно?

Вы не можете представить целое число 257 в одном байте, и его представление в двух байтах равно <<1, 1>>. Вы знаете, почему это так?

Строка "257" и целое число 257 - две совершенно разные вещи. Вы никогда не увидите: <<1, 2, 3, 257>> в эликсире (или эрланге), потому что каждое число между запятыми является целым числом, которое может помещаться в один байт. Кроме того, хотя строка эликсира является двоичной, двоичная строка не обязательно является строкой эликсира. Вы знаете, как это возможно?

Вы, кажется, думаете, что двоичный файл <<1, 2, 3>> представляет символы "1", "2" и "3". Это неверно. Двоичный файл <<1, 2, 3>> фактически представляет собой именованные символы Start of Heading, Start of Text и End of Text. Символ "1" фактически представлен двоичным кодом <<49>>:

iex(20)> <<49>>
"1"

Аналогично, символ "2" представлен двоичным кодом <<50>>, а символ "3" представлен двоичным кодом <<51>>. Нет такой вещи как символ "257" - это три символа "2", "5" и "7".

0 голосов
/ 30 августа 2018
  1. Это сильно зависит от того, что вы хотите добавить.

Наиболее общим (хотя, вероятно, самым многословным) решением было бы просмотреть чарлист:

<<1, 2, 3, 4>>
|> to_charlist()
|> Kernel.++([5])
|> to_string
#⇒ <<1, 2, 3, 4, 5>>
  1. Можно использовать Kernel.SpecialForms.for/1 понимание:
for i <- [1, 2, 3, 4, 5], do: <<i>>, into: <<>>
#⇒ <<1, 2, 3, 4, 5>>

Также, поскольку это чарлист, можно использовать Kernel.to_string/1:

to_string [1, 2, 3, 4, 5]
#⇒ <<1, 2, 3, 4, 5>>
0 голосов
/ 30 августа 2018

Вот что я нашел:

1> list_to_binary([<<"existing binary - ">>, integer_to_binary(1234, 10)]).
<<"existing binary - 1234">>
0 голосов
/ 29 августа 2018

В Elixir вы можете использовать оператор <>:

iex(1)> <<1, 2, 3, 4>> <> <<5>>
<<1, 2, 3, 4, 5>>

или двоичный синтаксис:

iex(1)> a = <<1, 2, 3, 4>>
<<1, 2, 3, 4>>
iex(2)> <<a::binary, 5>>
<<1, 2, 3, 4, 5>>

В Erlang используйте двоичный синтаксис с /binary:

1> A = <<1, 2, 3, 4>>.
<<1,2,3,4>>
2> <<A/binary, 5>>.
<<1,2,3,4,5>>

Редактировать: чтобы преобразовать список байтов в двоичный файл, используйте :erlang.list_to_binary/1:

iex(1)> :erlang.list_to_binary [1, 2, 3, 4, 5]
<<1, 2, 3, 4, 5>>
...