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

看例子:
  1. Erlang代码
  2. Eshell V5.8.4  (abort with ^G)
  3. 1> X = "hello".
先定义一个字符串变量X,下面把它变成二进制数据
  1. Erlang代码
  2. 2> BinX = list_to_binary("hello").
  3. <<"hello">>
这里的 list_to_binary 是erlang的内建函数。
字节流实际上就是一个二进制比特数组,相对应,直接将binary数据变回来的函数叫 binary_to_list:
  1. Erlang代码
  2. 3> binary_to_list(BinX).
  3. "hello"
到此为止都很简单,下面看看 erlang  的魔力:
  1. Erlang代码
  2. 4> <<First:8,Body:24,Last:8>> = BinX.
  3. <<"hello">>
  4. 5> First.
  5. 104
  6. 6> Body.
  7. 6646892
  8. 7> Last.
  9. 111
仔细看看,这不就是二进制版的模式匹配么(变量后面用冒号分隔的是截取的二进制数据位长度 )。
经过这个变化后,First就存放了第一个字符(二进制数据前八位) ”h” 的ascii码,
Last存放了最后一个字符(二进制数据的后八位) “o” 的 ascii 码,
Body 有些不同,它对应了中间的 24 位(8位一个字节,三个字节就是24位)数据,
因此看起来不像是一个 ascii 编码范围内的整数
现在把它们转变成字符串——
  1. Erlang代码
  2. 8> binary_to_list(First).
  3. ** exception error: bad argument
  4. in function  binary_to_list/1
  5. called as binary_to_list(104)
出现错误,为什么呢?
因为binary_to_list接受的是一个binary数据,而First本身已经是一个整数了,所以是参数错误,解决办法可以是这样
  1. Erlang代码
  2. 9> binary_to_list(<<First>>).
  3. "h"
这样很麻烦,实际上,更好的办法是在模式匹配的时候就说清楚我们需要的是一个binary而不是integer,
这一点erlang已经想到了,重新做一下是这样的:
  1. Erlang代码
  2. 10> <<First2:1/binary,Body2:3/binary,Last2:1/binary>> = BinX.
  3. <<"hello">>
  4. 11> binary_to_list(First2).
  5. "h"
  6. 12> binary_to_list(Body2).
  7. "ell"
  8. 13> binary_to_list(Last2).
  9. "o"
这里表示长度的数字有些变化,对于binary,它表示的是二进制字节数(之前是比特数)。
模式匹配的时候,如果最后一个变量长度为一个字节,那么是可以省略的——
  1. Erlang代码
  2. 14> <<First3:8,Body3:24,Last3>> = BinX.
  3. <<"hello">>
另外补充一点:一开始使用比特匹配的时候常常会遇到下面的错误
  1. Erlang代码
  2. 15> <<First4:8, Body4:16, Last3:8>> = BinX.
  3. ** exception error: no match of right hand side value <<"hello">>
这是因为左侧的表达式总字节数与右侧不符(8+16+8 != 5 * 8 ),这一点需要多加注意,常见的情况是错误的估计了右侧变量的比特数。
附注:  
  1. 完整的比特语法:
  2. <<>> %%表示一个空的二进制数据
  3. <<E1,E2,...,En>>
  4. 这里每一个 Ei 表示一个二进制数据区块。区块可能的形式有四种:
  5. Ei = Value |
  6. Value:Size |
  7. Value/TypeSpecifierList |
  8. Value:Size/TypeSpecifierList

转载于:https://blog.51cto.com/ma3yi/857950

erlang 二进制相关推荐

  1. [Erlang 0014]Erlang垃圾回收机制

    前面的Erlang杂记中我们简单提到过Erlang的垃圾回收机制:1.以进程为单位进行垃圾回收 2.ETS和原子不参与垃圾回收.今天我们继续这一话题,关注更多关于细节. 在Erlang的官方文档中,关 ...

  2. ERLANG日期与时间

    在开发过程中,有两个概念是和地区区域相关的:字符编码和时间;编码和时间的规范演变过程中有文化的冲突有历史的遗留,是软件开发中充满人文气息的一角;关于字符编码我之前整理过一篇文章, [Erlang 00 ...

  3. [Erlang]Erlang与C的节点通信

    Erlang节点之间的通讯,主要用于两个Erlang节点之间的通讯,但Erlang还支持与java构建的节点通讯,甚至与c构建的节点通讯,前面两种方式在我以前的文章都有讲到,所以这里讲Erlang与c ...

  4. Erlang与C构建的节点通讯

    Erlang节点之间的通讯,主要用于两个Erlang节点之间的通讯,但Erlang还支持与java构建的节点通讯,甚至与c构建的节点通讯,前面两种方式在我以前的文章都有讲到,所以这里讲Erlang与c ...

  5. [Erlang]如何使用NIF

    在Erlang中,NIF(Native Implemented Function)被用来扩展erlang的某些功能,一般用来实现一些erlang很难实现的,或者一些erlang实现效率不高的功能. N ...

  6. Windows下使用NIF扩展Erlang方法

    在Erlang中,NIF(Native Implemented Function)被用来扩展erlang的某些功能,一般用来实现一些erlang很难实现的,或者一些erlang实现效率不高的功能. N ...

  7. ERLANG unicode8

    不少人和我一样在Erlang实践过程中都会遇到中文的问题,其中有中文显示的问题有正则表达式匹配的问题等等;今天请教立涛之后梳理了一下,整理于此. 概念Unicode UTF-8 <深入理解计算机 ...

  8. Erlang 位串和二进制数据

    http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=25876834&id=3300393 因为在本人工作中,服务端Erla ...

  9. 二进制数据格式MessagePack:比JSON更快更轻巧

    2019独角兽企业重金招聘Python工程师标准>>> MessagePack是一种新的基于二进制的对象序列化类库.它可以像JSON那样,在许多种语言之间交换结构对象(比如移动app ...

最新文章

  1. 文本主题模型之非负矩阵分解(NMF)
  2. mysql保留2位小数字段如何设置 浮点数
  3. linux程序获取透传参数,Linux内核中TCP SACK处理流程分析
  4. WKQ学习(后台知识)
  5. DM6467之视频采集(Linux)下MMAP
  6. modbus-crc16——c语言
  7. 树莓派3代刷ubuntu mate在命令行下配置wifi不能连接的一个诡异的bug的解决
  8. 浅析JavaScript和PHP中三个等号(===)和两个等号(==)的区别
  9. 中河广播服务器怎么连接无线话筒,无线话筒怎么连接音响 话筒连接音响方法...
  10. Anaconda安装apscheduler库的步骤
  11. 实验3 OpenGL几何变换
  12. 领导力、愚狂和改变:爱因斯坦是否错了?
  13. 虚拟机管理解决方案逐个看:微软篇
  14. java用poi实现对word读取和修改操作
  15. V4L2抓取USB摄像头YUV视频数据代码
  16. 虚拟机搭建Windows2003步骤详解
  17. Mac在线网页版打字推荐
  18. 传感器实验——光敏电阻传感器
  19. maven多模块编译子包
  20. Vmware安装win10报错:operating system not found

热门文章

  1. 联通、华为《5G室内覆盖》白皮书!
  2. AI 热潮之下,初创企业能否躲过科技巨头的碾压?
  3. 甲方乙方和站在外包中间的你 | 每日趣闻
  4. “我在苹果商店下载了一个诈骗 App,损失 60 万美金!”
  5. 大写的服!90 后程序员利用业余时间帮网友鉴定毒蘑菇,拥有百万粉丝成网络大 V...
  6. TIOBE 12 月编程语言:Python 有望第四次成为年度语言!
  7. 2020携程“BOSS直播”大数据发布:GMV累计超11亿
  8. lambda函数详解
  9. Android应用打开外部文件
  10. 爱立信前CEO Hans Vestberg成为Verizon三巨头之一