`
cwqcwk1
  • 浏览: 85306 次
文章分类
社区版块
存档分类
最新评论

erlang binary数据转换的问题

 
阅读更多

erlang提供了binary_to_term,把一个二进制数据转为原始的erlang数据。但是,这个函数也有副作用。如果直接将对端传来的数据做一次 binary_to_term,就可能会导致VM crash掉。

binary_to_term 副作用

这是因为二进制数据带有原子时,binary_to_term会生成这些原子。但VM原子总数是有限制,而且原子不参与GC。假如数据带有原子数量超过erlang VM限制,就会导致VM crash

所以,针对这个问题,erlang提供了另外一个函数 binary_to_term(Binary, [safe]),这个函数不会生成新的的原子,在这点上,这两个函数关系也像 list_to_atom 和 list_to_existing_atom

1> term_to_binary(atom).
<<131,100,0,4,97,116,111,109>>
2> binary_to_term(v(1), [safe]).
atom
3> binary_to_term(v(1)).
atom
4> binary_to_term(<<131,100,0,4,116,101,115,116>>, [safe]).
%%这里会抛出异常
** exception error: bad argument
     in function  binary_to_term/2
        called as binary_to_term(<<131,100,0,4,116,101,115,116>>,[safe])
5> binary_to_term(<<131,100,0,4,116,101,115,116>>).
test
6> binary_to_term(<<131,100,0,4,116,101,115,116>>, [safe]).

%%这里就不会抛出异常
test
term_to_binary二进制压缩

与binary_to_term相反,term_to_binary 则是把erlang数据转成一个二进制数据。默认情况下,term_to_binary后的二进制数据是不经过压缩的,比较大,erlang也提供了另外一个函数,用于压缩生成的二进制数据。

term_to_binary(Term, [{compressed, Level}]

Level 取值范围1-9,表示压缩率,1是压缩比最低,但最少消耗时间,9是最高压缩比。 也可以是0,表示不压缩。

实际上,1已经能满足要求,又不会太消耗时间。而且,term_to_binary/2压缩后的二进制对 binary_to_term 影响不大

另外,term_to_binary做二进制压缩,必然带有一定的开销,但比term_to_binary后使用 zlib:zip 压缩数据来说,开销就小了很多,而且接收端还要zlib:unzip数据。显然term_to_binary/2 是在注重流量的场合比较适合。


参考:http://blog.csdn.net/mycwq/article/details/42622193


分享到:
评论

相关推荐

    介绍 Erlang binary 和 bit string 数据类型的经典文章

    ### Erlang Binary与Bit String 数据类型详解 #### 引言 Erlang 是一种功能强大且灵活的编程语言,尤其适合开发高并发、分布式及容错性应用。自 R12B 版本以来,Erlang 在处理二进制数据方面引入了两项重大更新:...

    <27>erlang record

    标题中的“&lt;27&gt;erlang record”可能指的是Erlang编程语言中的Record特性,它是一种数据结构,类似于结构体或者哈希表,用于组织和操作数据。在Erlang中,Record提供了一种方便的方式来定义和访问具有固定字段的数据...

    进行binary优化的json解析模块

    1. **二进制处理**:使用Erlang的`binary`模块,如`binary:match/3`和`binary:split/3`,直接在二进制数据上进行查找和分割,避免了转换成其他数据结构的开销。 2. **流式解析**(Streaming Parsing):为了避免一...

    Efficiency Guide (erlang)

    将二进制数据分割成两部分(`split_binary/2`)是一个高效的原语操作。然而,在频繁使用时仍需注意性能问题。 ##### 1.3.8 减法操作符(`-`) 减法操作在Erlang中并非内置操作符,而是通过函数调用来实现的。这意味...

    erlang r17官方api及stdlib手册

    14. **binary**: 处理二进制数据的函数,如`bin_to_list/1`和`list_to_bin/1`之间的转换。 Erlang R17的API手册还会详细介绍每个函数的参数、返回值、可能的错误以及使用示例,帮助开发者更好地理解和使用这些功能...

    binpp::1234:Erlang二进制漂亮打印机

    `binpp`就是这样一种工具,它提供了一个友好的界面,将难以解读的二进制数据转换为易于理解的格式。这对于理解和调试涉及大量二进制操作的代码非常有帮助。 **Erlang与Elixir之间的联系** Elixir是基于Erlang...

    Erlang中的socket编程简单例子

    服务器接收到数据后,将二进制数据转换为Erlang项,处理完数据后,将其重新编码为二进制数据,然后发送回客户端。 客户端方面,gen_tcp模块的connect函数用于建立连接到服务器的socket,send函数用于发送数据。这里...

    Erlang中的模块与模式匹配介绍

    此外,Erlang中还提供了二进制到Erlang数据类型的转换函数,例如`term_to_binary/1`和`binary_to_term/1`,用于二进制数据和Erlang数据之间的转换。 Erlang语言在设计时就考虑到了和C语言的互操作性。通过精心选择...

    ernie:有效的数据二进制编码(基于Erlang的外部条款格式)

    通过ERNIE,开发者可以轻松地将Rust程序产生的数据转换为ETF格式,发送给Erlang或Elixir节点,反之亦然。这使得跨语言的协作变得简单,无需进行复杂的接口设计或数据转换。 Elixir,作为建立在Erlang虚拟机上的动态...

    php实现与erlang的二进制通讯实例解析

    文本通讯是基于字符串数据格式进行信息交换,而二进制通讯则涉及直接的二进制数据传输,通常用于性能要求较高的场景,因为它可以减少编码转换的开销。 php实现与erlang的二进制通讯示例中,描述了如何通过编写代码...

    ecbor:Erlang CBOR库

    在处理数据序列化时,Erlang社区提供了多种库,其中之一就是ECBOR,它是Erlang对 Concise Binary Object Representation (CBOR) 的实现。CBOR是一种高效的数据序列化格式,适用于网络传输和存储,它在JSON的基础上...

    球拍位语法:球拍的Erlang样式二进制位串

    此外,Racket提供了`binary-&gt;integer`和`integer-&gt;binary`这样的函数,方便在整数和二进制位串之间转换。这对于处理如IP地址、MAC地址等二进制数据格式很有帮助。 在处理复杂的二进制数据结构时,Racket的解析库...

    luerl包及示例

    4. **处理结果**:`luerl:eval/2`和`luerl:call/3`会返回一个包含执行结果的Erlang二进制对象,可以通过`luerl:binary_to_term/1`将其转换为Erlang术语。 5. **错误处理**:如果Lua代码中发生错误,luerl会抛出一个...

    形式:用于Elixir的基于Typespec的JSON类数据解析

    5. **并发与 OTP**:由于Elixir是构建在Erlang VM之上的,它天然支持并发和容错,这对于处理大量JSON数据或在分布式系统中操作JSON数据非常有用。 6. **错误处理**:在解析JSON时,通常需要考虑解析失败的情况。...

    qr_code:用于生成QR码的库。 https:hexdocs.pmqr_code

    为了将`BitString`转换为PNG图像,你可以使用`Erlang`的`erlang:binary_to_list/1`函数和`ImageMagick`的`convert`命令: ```elixir qr_data = QRCode.encode("https://hexdocs.pm/qrcode") Path.write("/path/to/...

    Elixir程序设计语言221

    ETS(Erlang Term Storage)是内存中的表存储,而 Mnesia 是分布式数据库系统,两者都提供高效的数据存储: ```elixir table = :ets.new(:my_table, [:set, :public, :named_table]) :ets.insert(table, {key, ...

Global site tag (gtag.js) - Google Analytics