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

erlang 二进制与位语法(bit syntax)

 
阅读更多

Erlang的位语法(Erlang Bit Syntax)提供了一种方法来表示和匹配二进制数据,这使得Erlang二进制对象在某种程度上等同于其他Erlang对象,如元组和列表。也因为其快速高效,使得在Erlang中,二进制对象被广泛使用,尤其是在协议编程方面。(官方文档


位语法/比特语法(bit syntax)

Erlang的位语法表达式,即Erlang二进制的表示形式:

<<>> 
<<E1,...,En>>

每个元素Ei指定了一段二进制串(bit string)。每个元素Ei都是一个值,后面可以带有可选参数Size、TypeSpecifierList,如下:

Ei = Value |
     Value:Size |
    Value/TypeSpecifierList |
    Value:Size/TypeSpecifierList

Size表示前一个Value数据存储的位数,默认是8位,也就是一个字节。

TypeSpecifierList可以是以下几种类型及其组合,组合以 - 相连

Type = integer | float | binary | bytes |bitstring | bits | utf8 | utf16 | utf32

默认值是integer。bytes是binary的简写,bits是bitsring的简写

Signedness = signed | unsigned

只有当type为integer时有用,默认是unsigned

Endianness = big | little | native

当type为integer,utf16,utf32,float有用,默认是big

Unit = unit:IntegerLiteral

有效范围是1-256,integer、float和bitstring默认是1,binary默认是8

例如:

-define( UINT, 32/unsigned-little-integer).
-define( INT, 32/signed-little-integer).
-define( USHORT, 16/unsigned-little-integer).
-define( SHORT, 16/signed-little-integer).
-define( UBYTE, 8/unsigned-little-integer).
-define( BYTE, 8/signed-little-integer).
-define( CHAR, 1/binary-unit:8).

不同的bit syntax生成的二进制是不同的,如下:

2> <<111:16/signed-big-integer>>.
<<0,111>>
3> <<111:16/signed-little-integer>>.
<<111,0>>

下面以官方文档的一段代码,辅助理解下:

1> Bin1 = <<1,17,42>>.
<<1,17,42>>
2> Bin2 = <<"abc">>.
<<97,98,99>>
3> Bin3 = <<1,17,42:16>>.
<<1,17,0,42>>
4> <<A,B,C:16>> = <<1,17,42:16>>.
<<1,17,0,42>>
5> C.
42
6> <<D:16,E,F>> = <<1,17,42:16>>.
<<1,17,0,42>>
7> D.
273
8> F.
42
9> <<G,H/binary>> = <<1,17,42:16>>.
<<1,17,0,42>>
10> H.
<<17,0,42>>
11> <<G,H/bitstring>> = <<1,17,42:12>>.
<<1,17,2,10:4>>
12> H.
<<17,2,10:4>>

例子说明:

1、例子1和2:从一组常量或一个字符串来构造二进制对象

1> Bin1 = <<1,17,42>>.
<<1,17,42>>
2> Bin2 = <<"abc">>.
<<97,98,99>>

以上表示的二进制大小都是3字节(1+1+1)。

字符串"abc"转化成latin1码也就是 97,98,99,然后二进制默认用8位记录,所以结果就是<<97,98,99>>。

2、例子3:从一组限定边界的变量来构造二进制对象

3> Bin3 = <<1,17,42:16>>.
<<1,17,0,42>>

以上表示的二进制大小为4字节(1+1+2)。

上面,我们给42指定了16位(2个字节)的大小来记录,所以在内存中的数据为0000 0000 0010 1010,而Erlang二进制的默认表示,以1个字节(8位)为单位分割数据。

所以<<42:16>>构成的二进制也就是<<0:8, 42:8>> ,然后,8是默认值可以不显示,也就是<<0, 42>>


3、例子4、6:按照某种形式匹配二进制对象

4> <<A,B,C:16>> = <<1,17,42:16>>.
<<1,17,0,42>>
6> <<D:16,E,F>> = <<1,17,42:16>>.
<<1,17,0,42>>

例子4很好理解,这里说一下例子6吧,为何D会得到273的结果?

<<1,17,42:16>>生成的二进制数据前面说过了,为<<1,17,0,42>>

D:16表示匹配<<1,17,42:16>>前面16位的数据 <<1:8, 17:8>>,所以得到就是<<1,17>>

然后,<<1,17>>在内存中表示为0000 0001 0001 0001,结果就是256 + 16 + 1,也就是273,这就得到了D的值


4、例子11:也是从一组限定边界的变量来构造二进制对象,和例子3不同的是大小不是8的倍数。

<<1,17,42:12>>.

上面,我们给42指定了12位的大小来存储,所以在内存中的数据为0000 0010 1010,

这样构造出来的对象就是<<2,10:4>>

在erlang 二进制中,对象默认以8位为一个单位来表示,不足就向后面借位,比如:<<42:12,1,17>>生成的二进制对象是<<2,160,17,1:4>>,其实两者表达的是一段相同的二进制数据。


注意:

"B=<<1>>" 在erlang中被解释成 "B =< <1>>",这会引起一个语法错误“syntax error before: '<'”。正确的做法是写成 "B = <<1>>"


binary与bitstring的区别?

erlang文档有说明:

A bitstring is a sequence of zero or more bits, where the number of bits does not need to be divisible by 8. If the number of bits is divisible by 8, the bitstring is also a binary.

就是说,binary也是bitstring的一种,当二进制串大小能被8整除,就是binary


什么情况下会区分?

如模式匹配:

foo(<<A:8,Rest/binary>>) ->
	{binary, A, Rest};
foo(<<A:8,Rest/bitstring>>) ->
	{bitstring, A, Rest}.


2016/3/7 补充对二进制的解释,原标题名《erlang 位语法/比特语法(bit syntax)》

2015/7/17 补充binary与bitstring的区别

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

分享到:
评论

相关推荐

    erlang rebar 二进制

    erlang rebar 二进制

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

    ### Erlang二进制共享对象的存储方式 #### 引言 随着计算机技术的发展与进步,数据处理的速度和效率成为了衡量系统性能的关键因素之一。在众多优化策略中,缓存技术因其能显著提升数据访问速度而备受关注。本文将...

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

    Erlang语言以其高效处理并发和大量I/O操作而闻名,它提供了一种独特的语法来操作二进制位串,称为“球拍位语法”(Bit Syntax)。这种语法在Racket中也有类似的实现,被称作“Racket的球拍位语法”。本文将深入探讨...

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

    **Erlang与二进制数据处理** Erlang是一种函数式编程语言,以其在并发、分布式计算和容错领域的强大能力而闻名。在Erlang中,二进制数据是一种重要的数据类型,广泛用于处理网络协议、文件读写、序列化等场景。二...

    FsServer:Julia 的基于 TCP 的 Erlang 二进制术语服务器

    这个项目旨在为开发者提供一个高效且灵活的方式来传输和操作文件,特别是在分布式系统或者需要与其他使用 Erlang 二进制协议的系统交互的场景下。 在深入讲解 FsServer 的核心概念之前,我们先来了解一下 Julia ...

    erlang文献及资料汇总

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

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

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

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

    - **Erlang的位语法**:Erlang中的位语法允许开发者直接通过位模式来匹配二进制数据。这为处理二进制通讯提供了极大的便利,使得可以非常灵活地读取和构造二进制数据。 了解了上述知识点后,我们可以总结出php与...

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

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

    ohmyguard:erlang 函数保护的二进制模式匹配样式语法

    Erlang 二进制模式匹配是它最好的特性之一,也是它最简洁的语法,那么为什么不将它也应用于函数保护呢? 鉴于此功能: my_func ( Value ) when is_binary ( Value ) -&gt; Value . 可以简化为: my_func ( Value / ...

    Erlang OTP 20.1 Windows 64-bit Binary File

    Erlang OTP 20.1 Windows 64-bit Binary File 下载地址:http://www.erlang.org/downloads

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

    自 R12B 版本以来,Erlang 在处理二进制数据方面引入了两项重大更新:bit strings(位字符串)以及 binary comprehensions(二进制推导)。这些新特性不仅增强了Erlang处理二进制数据的能力,而且使得开发者能够更加...

    Erlang Windows 64位 安装包

    "Erlang Windows 64位 安装包"指的是针对Windows操作系统64位架构的Erlang二进制安装程序。这个特定的版本是v22.0,名为"esl-erlang_22.0_windows_amd64.exe",由Erlang Solutions Limited(ESL)提供。ESL是一家...

    Editplus 安装Erlang的语法包

    4. **管理语法文件**:在“配置文件”窗口中,找到“语法”(Syntax)选项卡,这里列出了所有已安装的语言包。 5. **添加Erlang语法**:点击“添加”(Add)按钮,浏览并选择刚刚下载的"erlang.stx"文件,确认后,...

    erlmc:Erlang Memcached二进制协议客户端

    Erlang二进制协议Memcached客户端 外部文件 二进制协议规范 快速开始 您必须具有1.3或更高版本的memcached $&gt; make $&gt; make test $&gt; sudo make install $&gt; memcached -d 1&gt; erlmc:start(). ok 2&gt; erlmc:stats(). ...

    Erlang语言安装包32位

    Erlang语言安装包,RibbitMQ消息处理所需支持语言,20.0 32bit

    Erlang23_3.zip

    "linux版本"的提法暗示了这个压缩包还可能包含适用于Linux操作系统的Erlang二进制文件。Linux是Erlang广泛应用的平台之一,因为其开源特性和对并发处理的良好支持与Erlang的理念相契合。 在实际使用Erlang时,...

    Erlang Syntax For Notepad++

    "Erlang Syntax For Notepad++" 是一个专门为Notepad++设计的插件或配置文件,目的是为Erlang源代码提供色彩丰富的语法高亮显示。这对于开发者来说极其重要,因为颜色编码可以帮助提高代码可读性和理解性,使得...

    erlang语言实现binary_to_term完整代码

    erlang提供了binary_to_term 函数,用于把二进制数据转为原始的erlang数据。这个函数都是c实现的,这里用erlang语言实现了,很有参考价值,其他语言可以参考这个解析erlang二进制协议数据。配套文章地址...

Global site tag (gtag.js) - Google Analytics