假设我有一个像这样的<<1,2,3,4>>
二进制文件,我想将其修改为<<1,2,3,4,5>>
。我该怎么办?
此外,我正在尝试将列表转换为二进制[1,2,3,4,5] => <<1,2,3,4,5>>
,但是我不确定该怎么做。
答案 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, 2, 3, 4>>
|> to_charlist()
|> Kernel.++([5])
|> to_string
#⇒ <<1, 2, 3, 4, 5>>
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 Heading
,Start of Text
和End of Text
的字符。字符"1"
实际上由二进制<<49>>
表示:
iex(20)> <<49>>
"1"
类似地,字符"2"
由二进制<<50>>
表示,字符"3"
由二进制<<51>>
表示。没有字符"257"
这样的东西,即三个字符"2"
,"5"
和"7"
。