如何将整数附加到现有二进制文件

时间:2018-08-29 18:51:14

标签: binary erlang elixir

假设我有一个像这样的<<1,2,3,4>>二进制文件,我想将其修改为<<1,2,3,4,5>>。我该怎么办?

此外,我正在尝试将列表转换为二进制[1,2,3,4,5] => <<1,2,3,4,5>>,但是我不确定该怎么做。

4 个答案:

答案 0 :(得分:4)

在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>>

答案 1 :(得分:1)

  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>>

答案 2 :(得分:0)

这是我发现的东西:

List<Task<string>> tasks = new List<Task<string>>();  

// ***Use ToList to execute the query and start the tasks.   
List<Task<string>> goodBadTasks = tasks.ToList();  

// ***Add a loop to process the tasks one at a time until none remain.  
while (goodBadTasks.Count > 0)  
{  
    // Identify the first task that completes.  
    Task<string> firstFinishedTask = await Task.WhenAny(goodBadTasks);  

    // ***Remove the selected task from the list so that you don't  
    // process it more than once.  
    goodBadTasks.Remove(firstFinishedTask);  

    // Await the completed task.  
    string firstFinishedTaskResult = await firstFinishedTask;  
    if(firstFinishedTaskResult.Equals("good")
         // do something

}  

答案 3 :(得分:0)

  

我注意到,如果列表包含的值大于255,我就是   获取参数错误(如果使用erlang函数)或值更改导致   我猜二进制元素的默认大小是1个字节。我怎么能够   克服这个?这有可能吗?

您不能在一个字节中表示整数257,而在两个字节中的表示形式是<<1, 1>>。你知道那是为什么吗?

字符串"257"和整数257是两个非常不同的东西。您永远不会看到:<<1, 2, 3, 257>>用elixir(或erlang)表示,因为逗号之间的每个数字都是一个整数,可以容纳一个字节。另外,尽管长生不老药字符串是二进制,但二进制不一定是长生不老药字符串。你知道怎么可能吗?

您似乎认为二进制<<1, 2, 3>>代表字符"1""2""3"。那是不对的。二进制<<1, 2, 3>>实际上代表名为Start of HeadingStart of TextEnd of Text的字符。字符"1"实际上由二进制<<49>>表示:

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

类似地,字符"2"由二进制<<50>>表示,字符"3"由二进制<<51>>表示。没有字符"257"这样的东西,即三个字符"2""5""7"