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

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>>
另一答案
  1. 它在很大程度上取决于你想要追加什么。

最通用的(尽管可能是最详细的)解决方案是通过charlist:

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

此外,因为它是一个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 HeadingStart of TextEnd of Text的字符。字符"1"实际上由二进制<<49>>表示:

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

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

以上是关于如何将整数附加到现有二进制文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将新数据附加到属性文件中的现有数据?

如何将NSMutable数组附加到现有文件中

如何将文本附加到 Java 中的现有文件?

java 简单的代码片段,展示如何将javaagent附加到运行JVM进程

java - 如何将节点附加到Java中的现有XML文件

将片段附加到framelayout时如何删除空格