`
fsword
  • 浏览: 168389 次
  • 性别: 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文献及资料汇总

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

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

    1. **应用资源文件(`.app`)**:这是一个以ERL编译后的二进制格式存储的文件,包含了应用的元数据,如应用名、版本、依赖的其他应用等。 2. **模块(`.erl`)**:实际实现功能的代码,可以是普通的函数模块,也...

    erlang资源

    1. **Erlang语法**:涵盖基本的变量、数据类型(如原子、列表、元组和二进制)、控制结构(如case表达式和if语句)以及函数定义。 2. **函数式编程概念**:Erlang是纯函数式语言,书中可能会介绍函数式编程的基本...

    erlang open poker 最好的入门程序源码

    6. **数据结构与模式匹配**:Erlang的元组(tuple)、列表(list)和二进制数据(binary)等数据结构在源码中会得到广泛运用。模式匹配用于解构数据和条件分支,使得代码更简洁。 7. **网络编程**:OpenPoker作为...

    Erlang中文手册.pdf

    - **1.1.2 其它方面**:文档省略了关于Erlang的许多高级主题,包括本地错误处理、单向连接、二进制数据处理、哈希表、运行时代码修改等。 #### 1.2 顺序编程 - **1.2.1 Erlang Shell**:Erlang提供了一个交互式的...

    Concurrent Programming in ERLANG (P1-90)

    这包括但不限于整数、浮点数、原子、列表、元组、二进制数据、PID等。了解这些术语对于理解Erlang程序的执行过程至关重要。 **2.2 模式匹配** 模式匹配是Erlang中的一个重要特性,它允许开发者在函数定义中使用...

    getting_started_erlang-5.4.pdf

    - **二进制数据处理(binaries/bitsyntax)**:Erlang 处理二进制数据的特殊语法。 - **列表推导(List Comprehensions)**:一种简洁的创建列表的方式。 - **与外部世界通信(ports)**:如何与其他语言编写的软件...

    Erlang中文手册

    - 参考文献、本地错误处理、单向连接、二进制数据处理等。 - 外部通信接口(如与其他语言编写的软件交互)、Erlang库的使用等。 - OTP框架的详细介绍、Mnesia数据库的使用等。 - 哈希表、动态代码更改等高级主题...

    thrift入门学习教程

    - **TBinaryProtocol**:使用二进制编码格式进行数据传输,效率高、占用资源少。 - **TCompactProtocol**:一种高效协议,使用Variable-Length Quantity (VLQ)编码对数据进行压缩。 - **TJSONProtocol**:使用JSON...

    elixir中文入门文档

    - **二进制(Binaries)**:用于存储二进制数据,例如图像或音频文件。 - **列表(Lists)**:有序集合,元素可以是任意类型。 - **元组(Tuples)**:固定长度的数据结构,可以包含不同类型的数据。 #### 四、基础...

    thrift入门教程+代码

    默认情况下,Thrift使用二进制协议,以提高数据传输效率。 4. 服务框架:生成的服务框架提供了基本的服务实现模板,开发者只需填充具体业务逻辑。例如,对于Java,Thrift会生成`Iface`、`Processor`、`Client`和`...

    Elixir编程入门

    - **二进制数据**:使用`&lt;&lt;&gt;&gt;`语法表示二进制数据,支持多种操作,如拼接和拆分。 ##### 2.6 键值、图、字典 - **键值对**:使用`{key, value}`表示。 - **图**:Elixir的图通常指有向图,可以使用列表来表示节点...

    RabbitMQ入门操作手册.pdf

    AMQP是一个二进制网络协议,定义了数据交互格式,而JMS是Java平台的API,用于在应用程序之间发送消息。 **AMQP**是高级消息队列协议,它的优势在于跨语言的兼容性和对数据交互格式的标准化,允许不同语言的系统之间...

    RabbitMQ入门教程.docx

    - 消息内容是以二进制形式存储的,这意味着它可以是任何形式的数据。 通过以上内容的学习,可以对RabbitMQ的基本概念和使用方法有一个初步的了解。随着深入学习,还可以掌握更多高级特性和应用场景。

    thrift基础文档

    4. **序列化/反序列化机制**:Thrift使用高效的二进制编码格式进行数据传输,比XML或JSON更快、更节省带宽。 5. **服务框架**:自动生成的代码包含服务接口的实现,开发者只需在这些接口上添加业务逻辑即可。 6. *...

    RabbitMQ 讲义.pdf

    AMQP是一种二进制协议,定义了网络交换数据的格式,而不从API层面限定实现方式,因此支持跨语言通信。AMQP通常用于支持多种消息模式。JMS则是一个Java平台的消息服务API,它定义了一组统一的消息操作接口,要求使用...

    关于软件语言分类的问题.txt

    - **编译型语言**:如C、C++、Java等,代码在执行前需要先编译成机器可理解的二进制代码。它们通常运行速度快,但编译过程可能耗费时间。 - **解释型语言**:Python、Ruby、JavaScript等,代码在运行时逐行解释...

Global site tag (gtag.js) - Google Analytics