erlang学习笔记--BIF,二进制数据,比特语法

1.BIF: BIF:(built-in function)内建函数,是erlang语言的组成部分。是erlang虚拟机中的基本操作。 tuple_to_list/1将元组转换为列表,time/0返回当前时间的时,分,秒。 1> tuple_to_list({12,cat,"ddd"}). [12,cat,"ddd"] 3> time(). {12,35,57} 2.二进制数据: 一种数据类型,用来实现原始数据的高速存储。节省内存,输入输出更加高效。书写打印时,二进制数据以一个整数或者字符序列的形式出现,两端分别用尖括号括起来。其中的整数,每一个都要在0-255之间,如果二进制数据是可以打印的字符串,shell将显示字符串形式,否则会显示一串整数。 @spec 描述函数的参数和返回类型。类型标注,不是erlang代码而是注释文档的一部分,shell中不能使用这些标注。erlang中的模块声明也是注释的一部分。 erlang通过BIF来构造二进制数据或者从中提取数据,或者通过比特语法来完成这一过程。 @spec list_tbo_inary(IoList) -> binary() @spec split_binary(Bin,Pos) -> {Bin1,Bin2} @spec term_to_binary(Term) -> Bin @spec binary_to_term(Bin) -> Term list_tbo_inary将IoList中所有东西转换为一个二进制数据。split_binary在pos位置将二进制数据分割成两个部分。下面两个是互逆。 4> Bin1 = <<1,2,3>>. <<1,2,3>> 5> Bin2 = <<4,5>>. <<4,5>> 6> Bin3 = <<6>>. <<6>> 7> list_to_binary([Bin1,1,[2,3,Bin2],4|Bin3]). <<1,2,3,1,2,3,4,5,4,6>> 12> split_binary(<<1,2,3,1,2,3,4,5,4,6>>,4). {<<1,2,3,1>>,<<2,3,4,5,4,6>> 14> term_to_binary({11,'333a',use}). <<131,104,3,97,11,100,0,4,51,51,51,97,100,0,3,117,115,101>> 15> binary_to_term(<<131,104,3,97,11,100,0,4,51,51,51,97,100,0,3,117,115,101>>). {11,'333a',use} 返回二进制数据字节长度 16> size(<<1,2,3,4>>). 4 3.比特语法 比特语法:一种模式匹配语法,用于二进制数据中的比特进行封包和解包工作。 比特语法是模式匹配的一种扩展。编写底层代码时,常会需要对比特级别的二进制数据进行封包解包,会体现比特语法的便捷,比特语法针对协议编程而设计(erlang的看家本领 哇塞)。 16bit色彩的封包解包 19> Red = 2. 2 20> Green = 54. 54 21> Blue = 20. 20 22> Men = <<Red:5,Green:6,Blue:5>>. <<22,212>> 23> Mem = <<Red:5,Green:5,Blue:5>>. <<21,84:7>> 24> <<R1:5,G1:6,B1:5>> = Men. <<22,212>> 25> R1. 2 27> G1. 54 28> B1. 20 可以看到是用:进行匹配,冒号前是数据,后是所占的比特数。 比特语法表达式 嗯,这里讲比特语法格式: 比特语法的形式:<<>>或者<<E1,E2,E3,E4,...,En>>。Ei有四种形式: Ei = Value | Value:Size | Value/TypeSpecifierList | Value:Size/TypeSpecifierList 二进制数据中总比特数恰好被8整除(二进制数据中每个字节都是8bit)。Value必须是一个绑定变量、文本串或者一个返回值的整数。浮点数、二进制数据的表达式。Size必须为一个整型或者整型绑定变量,不能是自由变量。整型默认Size为8,浮点型为64,二进制则为本身长度。SpecifierList决定字节序,取值为: @type End = big| little |native 书上给出一个例子来了解这三种排序和默认排序,不同机器可能不同。 37> {<<16#12345678:32/big>>,<<16#12345678:32/little>>,<<16#12345678:32/native>>,<<16#12345678:32>>}. {<<18,52,86,120>>, <<120,86,52,18>>, <<120,86,52,18>>, <<18,52,86,120>>} 4.使用总结 块表达式: begin Expr1, .... Exprn end 块得值就是快中最后一个表达式的值,用于当代码某处只允许使用单个表达式而你要用一串表达式时。 注释: 只有行注释%,没有块注释。 列表操作符++ ——:对列表进行添加和删除的中缀操作符。 比较表达式: 所有类型都定义了大小比较顺序: number<atom<reference<fun<port<pid<tuple<list<binary 作用:可以对存储了任何类型的列表进行排序,并根据比较顺序,编写高效的数据访问代码。 出了=:=,=/=外,其他都遵循下面规则: 如果一个比较参数为整数,另一个浮点数, 整数在比较前需要转换成浮点数。 如果两个比较参数都是整数或者浮点数,直接比较。。。 ==只适用于浮点数和整数的比较。最好都用=:=。   下划线变量: 如果一个变量在一个字句中只被使用一次,编译器会提出警告。但以下划线开始,那么编译器不会产生警告信息。 命名不准备使用的变量,增加可读性。方便调试。

上一篇:
下一篇:

相关文章:

Categories: 博客记录

0 Responses so far.

Leave a Reply