`
fsword
  • 浏览: 164502 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[erlang入门学习] erlang中的二进制数据处理

 
阅读更多

在网络编程中,我们面对的不再是字符串,而是字节流,对于这些信息的处理,erlang提供了比特语法这样的工具。

 

废话少说,看例子:

 

Eshell V5.8.4  (abort with ^G)
1> X = "hello".

 

先定义一个字符串变量X,下面把它变成二进制数据

2> BinX = list_to_binary("hello").
<<"hello">>

 

这里的 list_to_binary 是erlang的内建函数,专业术语叫 BIF ( Build-in Function),通过它,我们得到了一个二进制数据 BinX 。

字节流实际上就是一个二进制比特数组,相对应,直接将binary数据变回来的函数叫 binary_to_list:

3> binary_to_list(BinX).
"hello"

到此为止都很简单,下面看看 erlang  的魔力:

 

4> <<First:8,Body:24,Last:8>> = BinX.
<<"hello">>
5> First.
104
6> Body.
6646892
7> Last.
111
 

仔细看看,这不就是二进制版的模式匹配么(变量后面用冒号分隔的是截取的二进制数据位长度 )。经过这个变化后,First就存放了第一个字符(二进制数据前八位) ”h” 的ascii码,Last存放了最后一个字符(二进制数据的后八位) “o” 的 ascii 码,Body 有些不同,它对应了中间的 24 位(8位一个字节,三个字节就是24位)数据,因此看起来不像是一个 ascii 编码范围内的整数

 

现在把它们转变成字符串——

8> binary_to_list(First).
** exception error: bad argument
     in function  binary_to_list/1
        called as binary_to_list(104)
 

出现错误,为什么呢?

因为binary_to_list接受的是一个binary数据,而First本身已经是一个整数了,所以是参数错误,解决办法可以是这样

9> binary_to_list(<<First>>).
"h"
 

这样很麻烦,实际上,更好的办法是在模式匹配的时候就说清楚我们需要的是一个binary而不是integer,这一点erlang已经想到了,重新做一下是这样的——

10> <<First2:1/binary,Body2:3/binary,Last2:1/binary>> = BinX.
<<"hello">>
11> binary_to_list(First2).                                  
"h"
12> binary_to_list(Body2). 
"ell"
13> binary_to_list(Last2).
"o"

 

这里表示长度的数字有些变化,对于binary,它表示的是二进制字节数(之前是比特数)。

 

模式匹配的时候,如果最后一个变量长度为一个字节,那么是可以省略的——

14> <<First3:8,Body3:24,Last3>> = BinX.
<<"hello">>
 

另外补充一点:一开始使用比特匹配的时候常常会遇到下面的错误

15> <<First4:8, Body4:16, Last3:8>> = BinX.
** exception error: no match of right hand side value <<"hello">>

 

这是因为左侧的表达式总字节数与右侧不符(8+16+8 != 5 * 8 ),这一点需要多加注意,常见的情况是错误的估计了右侧变量的比特数。

 

附注:

完整的比特语法:
<<>> %%表示一个空的二进制数据
<<E1,E2,...,En>>

这里每一个 Ei 表示一个二进制数据区块。区块可能的形式有四种:

Ei = Value |

       Value:Size |

       Value/TypeSpecifierList |

       Value:Size/TypeSpecifierList
 

 

1
2
分享到:
评论
1 楼 fair_jm 2013-06-30  
谢谢lz的文章 例子举得通俗易懂 很有启发 ^_^

相关推荐

    erlang rebar 二进制

    erlang rebar 二进制

    erlang二进制共享对象的存储方式

    erlang二进制共享对象的存储方式的讨论

    PHP扩展模块解包Erlang term二进制数据

    有些同学想把Erlang数据通过term_to_binary函数封包后以二制进形式存入数据库,然后用PHP读取并解包成PHP数组。 为了解决上面的这种应用场合中遇到的问题, 参考peb(Php-Erlang Bridge)扩展写了这个类似erlang:...

    erlang文献及资料汇总

    erlang位运算与二进制解析 erlang二进制高效编程 erlang异常处理详解 开发经验: 面对软件错误构建可靠的分布式系统 编写分布式的 Erlang 程序:陷阱和对策 硝烟中的Erlang 深入底层: erlang VM基于多核处理器的...

    erlang入门学习经典资料(很不错)

    很不错的erlang学习资料。推荐刚上手的同学下载学习。

    Erlang入门

    一本简约的Erlang语言入门书, 本书涵盖了从Erlang的起源到广泛应用的高可靠消息专递系统。

    Erlang入门:构建application练习2

    Erlang入门:构建application练习3,实例演示如果构建一个最简单的Erlang Application

    Erlang入门:构建application练习5(监督树)

    Erlang入门:构建application练习5(监督树),以实例完全演示监督树的用法,Erlang入门必须知道的那点事

    etfs:一种简单的基于Erlang外部术语格式的流式二进制序列化容器格式

    ETFs是一种基于Erlang的外部术语格式(即erlang:term_to_binary/1 )的简单的可流式二进制序列化容器格式。 用法 ETFs的公共接口是ETFs.stream!/1 。 ETFs.stream! 从Enumerable和Collectable的意义上讲,它生成的...

    Erlang入门手册

    Erlang不但是一种编程语言,而且它具有比编程语言更加贴近操作系统的一些特性:并发线程、作业调度、内存管理、分布式、网络化等。据说使用Erlang编写的Yaws Web服务器,其并发性能是apache的15倍!

    erlang开发入门教程

    erlang是爱立信开发的程序开发语言,融合了函数式编程与面向对象编程,并行处理内建与程序语言内部,特别适合创建并发行、容错性、分布性要求比较高的软实时系统,掌握它程序员必备的一种编程技能,与它相似的语言...

    erlang入门级练习:LeetCode OJ问题的部分erlang 源码

    我自己在新学erlang,在LeetCode OJ上找了题目练习,题目很适合新手熟悉语言,但是LeetCode OJ里面只有几门主流语言的答案,下面是已完成的erlang源代码,后续有空再做其他问题续传,题目包含:(源码开头都有题目...

    bstr:Erlang库将二进制文件用作字符串

    Erlang库将二进制文件用作字符串。 要求 在以下OTP版本中进行了测试: 17.1 17.0 R16B03-1 R16B03 R16B02 R16B01 安装 要初始化项目,请运行make bootstrap 。 要编译模块,您只需运行make 。 要运行单元...

    erlang程序设计与入门

    erlang程序设计 erlang入门手册

    Erlang语音学习资料汇总

    资源名称:Erlang语音学习资料汇总资源目录:【】Erlang程序设计【】[ManningPublications]ErlangandOTPinAction【】[NoStarchPress]LearnYouSomeErlangforGreatGood!ABeginner'sGuide【】[O'ReillyMedia]...

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

    一般来说网络通讯常用的方式有2种:文本通讯和二进制通讯。php与erlang之间实现文本通讯比较简单,这里就不做讨论,本文主要讨论的是php与erlang实现二进制通讯的实现方法。实现步骤如下: erlang端代码: 复制代码 ...

    erlang 连接学习例子

    erlang 连接学习例子 最简单的通讯例子

    Erlang并发编程,Erlang程序设计,Erlang中文手册

    学习erlang的好资料。  Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此非常适 合于构建分布式,实时软并行计算系统。 使用...

    Erlang入门:构建application练习4(进程link的作用)

    Erlang入门:构建application练习4(进程link的作用),实例演示进程link的作用及效果

    erlang学习相关资料

    Joe的那篇erlang论文 Programming Erlang + 源码包 Erlang Programming Concurrent Programming in Erlang efficiecy guide 资源齐全.希望能帮到你.

Global site tag (gtag.js) - Google Analytics