如何将整数附加到现有二进制文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将整数附加到现有二进制文件相关的知识,希望对你有一定的参考价值。
假设我有一个像这个<<1,2,3,4>>
的二进制文件,我想将其修改为<<1,2,3,4,5>>
。我该怎么做?
此外,我试图将列表转换为二进制[1,2,3,4,5] => <<1,2,3,4,5>>
但我不知道该怎么做。
在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>>
- 它在很大程度上取决于你想要追加什么。
最通用的(尽管可能是最详细的)解决方案是通过charlist:
<<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>>
此外,因为它是一个charlist,人们可能会使用Kernel.to_string/1
:
to_string [1, 2, 3, 4, 5]
#⇒ <<1, 2, 3, 4, 5>>
这是我发现的:
1> list_to_binary([<<"existing binary - ">>, integer_to_binary(1234, 10)]).
<<"existing binary - 1234">>
我注意到如果列表包含大于255的值我得到一个参数错误(如果是erlang函数)或更改的值导致二进制元素的默认大小是1字节我猜。我怎么能克服这个?这甚至可能吗?
你不能在一个字节中表示整数257
,它在两个字节中的表示是<<1, 1>>
。你知道为什么吗?
字符串"257"
和整数257
是两个非常不同的东西。你永远不会看到:elixir(或erlang)中的<<1, 2, 3, 257>>
,因为逗号之间的每个数字都是一个可以放在一个字节中的整数。另外,尽管elixir字符串是二进制,但二进制不一定是elixir字符串。你知道怎么可能吗?
你似乎认为二进制<<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"
。
以上是关于如何将整数附加到现有二进制文件的主要内容,如果未能解决你的问题,请参考以下文章