热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Erlang第二课

Erlang是被设计来用在电信设备中的,这意味着需要处理大量的二进制数据。也正因为如此,Erlang把binary和binarystring提升到了一个相当高的位置,提供了极为

Erlang是被设计来用在电信设备中的,这意味着需要处理大量的二进制数据。也正因为如此,Erlang把binary和binary
string提升到了一个相当高的位置,提供了极为丰富的操作机制。当然,丰富意味着多,多了可能会有些眼花缭乱,有人给的建议是,如果感觉搞不定怎么处理bit串,可以先在shell里面慢慢的试出自己要的表达,然后copy到程序中去。

 

1、下面例子形象展示了bit 流的组装:



> Color = 16#F09A29.
15768105
> Pixel1 = <>.
<<")">>
> Pixel2 = <>.
<<154,41>>
> Pixel3 = <>.
<<240,154,41>>

我们可以看到:

>1)在定义Pixel1时,我们没有给bit串指定长度,所以,它默认是一个byte,而0x29恰好是字符“)”;

>2)在定义Pixel2时,我们指定bit串的长度是16,我们看到他把后面16位转换为bit串,即我们看到的两个8bit长数字;

>3)在定义Pixel3时,我们指定bit串的长度是24,然后我们就得到了完整的bit串-3个8bit长的bit串。

 

2、用patten matching 对bit流进行拆分,具体如下:



1> Pixels = <<213,45,132,4,76,32,76,0,0,234,32,15>>.
<<213,45,132,4,76,32,76,0,0,234,32,15>>
2> <> = Pixels.
** exception error: no match of right hand side value <<213,45,132,4,76,32,76,0,0,234,32,15>>
3> <> = Pixels.
<<213,45,132,4,76,32,76,0,0,234,32,15>>
4> <>.
<<213,45,132>>

这里的操作有:

1)表达式2并没有指定patten
matching的长度,Erlang默认按8bit处理,所以,4x8=32bit,与右边的4x24长度不匹配。即,弹出的error:no match。

2)表达式3我们指定了24-24-24-24这样的长度,与右边匹配,所以取出了<>=<<213,45,132>>.

另外,如果我们只去第一个8位,是没必要去拆开整个bit串的,Erlang给我们准备了一个语法糖:


> <> = Pixels.
<<213,45,132,4,76,32,76,0,0,234,32,15>>
> R.
213

 

3、Erlang中bit串的描述方式包括:



  • Value

  • Value:Size

  • Value/TypeSpecifierList

  • Value:Size/TypeSpecifierList

我们来具体看看这些是什么。其中,TypeSpecifierList有“Unit:xxx”,
“Type”,“Signedness”还有“Endianness”几种,使用时用(-)来隔开:

-Value. 这个bit串代表的这个数值为多少。

-Size. 这一bit串占用了多少Unit。

-Unit:xxx. xxx 取值范围是1-255,表示每Unit占的bit数。Size x
Unit为该数实际占用的bit数。

-Type.
这个属性描述了bit流是按什么方式组织的,有integer,float,binary(bytes),bitstring(bits),utf8,utf16,
and
utf32。如果没有指定格式,Erlang会默认认为他是integer类型。其中integer,float,binary默认的一个unit占1bit,我们可以用Unit来指定各个type每个unit占用几个bit;这仅仅表示它申请了这么多内存,但是存放时仅仅是在前面插了一些0。例如,



> <<8:8/unit:2>> == <<8:16>>.
true
> <<123456:16/unit:2>>.
<<0,1,226,64>>
> <<123456:32>>.
<<0,1,226,64>>

如上,“16个unit,每个unit占2bit”与“32个unit,每个unit占1bit”表示的是同样多的bit数。

-Signedness.这一属性只有两个选项signed和unsigned,默认是unsigned。同时,只有bit串是integer类型的时候,我们才会考虑这一属性。

-Endianness.可能的值有big,little,native,默认是big,而且在标准的网络协议应用中都是big
ending。同时,大小端只有在数据是integer,utf16,utf32,或者是float时有用。native取决于cpu运行时使用大端还是小端。

 举例:



1> <> = <<72,0,0,0>>.
<<72,0,0,0>>
2> Y.
1207959552
3> <> = <<72,0,0,0>>.
<<72,0,0,0>>
4> X.
72

上面的代码中:

-1中,这个bit串是integer型的,它的值为Y,Size为4,每个Unit为8位。那么,右边的bit串代表一个integer的话,这个integer的值应该是1207959552。

-3中,这个bit串同样是integer型的,它的值为X,Size为4,每个Unit为8位;但是,这个bit串是小端存放的。那么,右边的bit串如果代表一个小端存放的integer的话,这个integer的值应该是72。

 

4、bit串的运算方式有:左移(bsl,bit shift left),右移(bsr,bit shift
right),按位与(band),按位或(bor),按位亦或(bxor),按位取反(bnot)。

 

5、binary strings处理字符串要比Lists更加的节省空间,主要是Lists事实上更像是链表,而binary更像是array(a
tightly packed block of memory)。所以,在不需要对字符串进行太多处理,或者是内存比较敏感的情况下,大家更乐意用binary
string。

ps:尽管binary
string是种轻量级的方案,但是,我们还是应该尽量避免使用它来做tag。这是因为,没有什么比atom更适合做tag了,使用其它就多余了。


> <<"this is a binary string!">>.
<<"this is a binary string!">>

 

6、binary comprehension是和Lists
comprehension一样的存在。只不过,我们在描述元素属于某个bit串时,使用的符号由"<-"变成了“<=”;描述的目标是一个bit串时,我们要把最外面的“[
]”,同样换成"<<>>"。具体可以看下面两个例子:


> Pixels = <<213,45,132,64,76,32,76,0,0,234,32,15>>.
<<213,45,132,64,76,32,76,0,0,234,32,15>>
> RGB = [ {R,G,B}||<> <= Pixels ].
[{
213,45,132},{64,76,32},{76,0,0},{234,32,15}]

这样,我们轻松的把Pixels数据转化为RGB tuple的lists。注意“<> <=
Pixels”一句,8-8-8只有24个bit,而Pixels有12 X 8个bit,所以,这里处理的时候,是按描述循环取了四次。

另一个例子恰恰相反:


> <<<> || {R,G,B} <- RGB >>.
<<213,45,132,64,76,32,76,0,0,234,32,15>>

 ps:我们要注意generator返回的bit串是什么类型,忽略的话可能会出错。比如在下面例子中:


> <<<> || Bin <- [<<3,7,5,4,7>>]>>.
** exception error: bad argument
> <<<> || Bin <- [<<3,7,5,4,7>>]>>.
<<3,7,5,4,7>>

首先应该注意到,[<<3,7,5,4,7>>]是构建了一lists,其中只有一个元素,即,一个bit串。

上面的代码先是定义bit串<>,Value的类型默认是integer,即Bin是一个integer类型的数,然后尝试把generator产生的bit串赋值给Bin...等等,这就是bad
argument的根源所在。

第二次,我们声明Bin的Value是binary类型的,所以,我们成功的接收了这个bit串。

 

更多关于bit串的处理,参见: >http://user.it.uu.se/~pergu/papers/erlang05.pdf
 

Erlang第二课,布布扣,bubuko.com


推荐阅读
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
author-avatar
kenan0072010
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有