Как определить двоичный файл в другом двоичном файле? - PullRequest
2 голосов
/ 20 февраля 2012
A = <<"hello">>.
B = <<A:80/binary, 100:8>>.

Это дает мне:

** ошибка исключения: неверный аргумент

и <<"hello">>. работает, но:

A = "hello".
<<A>>.

не может работать.

Ответы [ 2 ]

4 голосов
/ 20 февраля 2012

A не имеет размера 80 байт, что явно не соответствует A:80/binary в первом случае.

1> A = <<"hello">>.
<<"hello">>
2> B = <<A/binary, 100:8>>.
<<"hellod">>
3> Pad = 80 - size(A), C = <<A/binary, 0:Pad/unit:8, 100:8>>.
<<104,101,108,108,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  0,0,0,0,0,0,...>>

<<"hello">> - синтаксический сахар для <<$h,$e,$l,$l,$o>>.Битовое синтаксическое выражение предполагает спецификацию типа 8/integer,unsigned,big,unit:1 по умолчанию.A не является целым числом, поэтому <<A>> вызывает badarg исключение во втором случае.

0 голосов
/ 20 февраля 2012

Значение << "Hello" >> работает, но только потому, что "Hello" является строковым литералом.Когда вы пишете

  A = "Hello",

, вы создаете объект String, который на самом деле представляет собой список кодовых точек Unicode.Теперь, когда вы объявляете,

  <<A>>

, тогда A считается целым числом, потому что это значение по умолчанию.Естественно, что-то не так, когда вы пытаетесь ввести список / строку для целого числа, что является причиной плохой ошибки.

Решение двоякое:список в двоичный файл.Теперь у вас есть эквивалент <<A/binary>>, и вы можете манипулировать им:

   L = byte_size(A),
   <<L:32/integer, A/binary>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...