做网站什么用,建网站学什么,抖音seo优化系统招商,提升学历的正规机构http://blog.chinaunix.net/xmlrpc.php?rblog/articleuid25876834id3300393 因为在本人工作中#xff0c;服务端Erlang和客户端的flash通信都是发送二进制数据#xff08;协议#xff09;来通信#xff0c;Erlang处理起来二进制数据真的很方便#xff0c;在空余… http://blog.chinaunix.net/xmlrpc.php?rblog/articleuid25876834id3300393 因为在本人工作中服务端Erlang和客户端的flash通信都是发送二进制数据协议来通信Erlang处理起来二进制数据真的很方便在空余时间查看和翻译了Erlang的二进制相关一些说明文档当然里面也有根据自己的经验和知识理解的地方。 在二进制解析部分其实还有很多好的例子。还有就是Erlang的二进制实际应用的例子下次会再分享的翻译不到位的地方还请多多指正原文地址 http://www.erlang.org/doc/programming_examples/bit_syntax.html#id64786 http://www.erlang.org/doc/reference_manual/expressions.html#id79300 点击(此处)折叠或打开 Erlang 位串和二进制数据 位串bitstring是由一些有比特bit理解为‘位’组成不要求包含的比特数量能够整除8如果恰好能够整除8的话那么这个位串就是个binary。 位串中的每一个位都位于确定的一个段中一个段由一串连续的位组成段之间没有界限如首位是第一个段紧接着就是第二个段。 下面的例子演示了二进制数据的构造匹配还有如何获取和使用二进制数据中的元素。 1. 一些简单的例子例一 一个二进制数据由一组常量或者简单字符串构成Bin11 1, 17, 42,Bin12 abc产生的二进制数据大小为3binary_to_list(Bin11)计算结果是[1, 17, 42], binary_to_list(Bin22)计算结果是 [97, 98, 99]. 例二 类似的一个二进制数据也可以由一组已绑定的变量构成A 1, B 17, C 42,Bin2 A, B, C:16产生的二进制数据大小为4binary_to_list(Bin2)计算结果是 [1, 17, 0, 42]。这里C使用了尺寸表达式size expression,指定了C这个段在二进制数据中占用16位也就是两个单位长度。 例三 二进制数据也可以进行匹配操作。假设DEF是自由变量Bin2为例二中的变量 D:16, E, F/binary Bin2结果 D 273因为D包含了A,B两个段二进制转换为10进制之后的结果E 0F 42这里在我的机器上是 *,我的erlang版本比文档上的版本新 2.注意 语法上应该要注意的地方 B1 这样的写法会被erlang编译器理解为 B 1 这样就会产生语法错误。正确的写法应该是 B 1 。 3.二进制数据各个部分介绍 位串中每一个段都遵循通用的语法格式如下Value:Size/TypeSpecifierList 值:大小/类型因为Size和TypeSpeciferList不是必须指明的所以在书写的时候它们可以省略下面的格式是正确的ValueValue:SizeValue/TypeSpecifierList当没有指明使用什么规范时就使用默认值(默认规范也可以理解为默认语法约定)。默认值会在下面解释在构造二进制数据结构的时候Value可以是任何表达式在进行二进制的匹配操作时Value必须是一个普通的单词(literal )或者变量。Size 指明该段占多少位要是指明了 TypeSpecifierList 类型Size表示的多少个单位长度size必须是整数。TypeSpecifierList 由 ‘-’ 隔开的一组属性组成可以由四个部分构成 Type 类型可以是 Integer, Float, Binary Signedness 规定是无符号还是有符号 Endianness 规定字节存储序列 Unit 单位长度必须能被Size 整除如 X:4/little-signed-integer-unit:8 X 的总大小是 4 * 8 32 bit啰 4.默认约定 二进制中每个段的数据类型默认是整型默认的类型不依赖于值即便值是一个单词。类似的 3.14 的类型也是整型不是浮点型。 默认的大小Size由类型决定整型是8浮点是64如果是binary类型的话就是该binary的整个长度。在匹配操作中只有最后一段数据使用默认大小才是合法的其他位置的数据段必须指定大小。 默认的单位长度整型和浮点都是1binary是8. 默认是无符号 默认的字节序列是大头排列 5.构造一个binary 和 位串bitstring 构造二进制的语法和创建列表和元组不一样如果参数错误的话会爆出 “badarg”的错误。 一个二进制可以由一个或多个段构成0个段 “”表示大小为零的二进制数据很多时候我们会发空 的二进制作为触发没个事件的信号。 Bin/binary,Bitstring/bitstring 这样一个数据Bin的大小一定是8比特的整数倍而Bitstring的大小一定是1的整数倍。 下面的数据 X:1, Y:6 可以成功构造一个大小为7bit的位串特别的提出一点 X1:8 是错误的应该写作 (X1):8 hello 等价于 $h,$e,$l,$l,$o ,前者在语法上比后者更加便利语法糖6.二进制数据的匹配操作 匹配操作的时候记住Size一定是一个整数或者绑定的变量值为整数如 foo(N, X:N,T/binary) - {X,T}. 这样是错误的因为在编译的时候N作为Size还没有绑定。 正确的做法 foo(N, Bin) - X:N,T/binary Bin, {X,T}.7.获取一个二进制和位串的剩余部分 foo(A:8,Rest/binary) - Rest的大小一定能整除8 foo(A:8,Rest/bitstring) - Rest的大小没有严格限制了 8.位串解析Bit String Comprehensions 位串解析类似列表解析是一种非常高效的产生新的位串的方法一般语法如下 BitString || Qualifier1,...,QualifierN BitString一个合法的位串表达式Qualifier是位串生成器或者过滤器 一般的生成器如列表解析里面通常写作 Pattern - ListExpr. 而位串生成器写作 BitstringPattern BitStringExpr. 当然了这里BitStringExpr 肯定一个合法的位串表达式 过滤器是一个返回true或false的表达式 具体的例子 (X*2) || X 1,2,3 . 2,4,6 1.BIFBIFbuilt-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) - Binspec binary_to_term(Bin) - Termlist_tbo_inary将IoList中所有东西转换为一个二进制数据。split_binary在pos位置将二进制数据分割成两个部分。下面两个是互逆。 4 Bin1 1,2,3.1,2,35 Bin2 4,5.4,56 Bin3 6.67 list_to_binary([Bin1,1,[2,3,Bin2],4|Bin3]).1,2,3,1,2,3,4,5,4,612 split_binary(1,2,3,1,2,3,4,5,4,6,4).{1,2,3,1,2,3,4,5,4,614 term_to_binary({11,’333a’,use}).131,104,3,97,11,100,0,4,51,51,51,97,100,0,3,117,115,10115 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).43.比特语法比特语法一种模式匹配语法用于二进制数据中的比特进行封包和解包工作。比特语法是模式匹配的一种扩展。编写底层代码时常会需要对比特级别的二进制数据进行封包解包会体现比特语法的便捷比特语法针对协议编程而设计erlang的看家本领 哇塞。16bit色彩的封包解包 19 Red 2.220 Green 54.5421 Blue 20.2022 Men Red:5,Green:6,Blue:5.22,21223 Mem Red:5,Green:5,Blue:5.21,84:724 R1:5,G1:6,B1:5 Men.22,21225 R1.227 G1.5428 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.使用总结 块表达式 beginExpr1,….Exprnend 块得值就是快中最后一个表达式的值用于当代码某处只允许使用单个表达式而你要用一串表达式时。 注释 只有行注释%没有块注释。 列表操作符 ——对列表进行添加和删除的中缀操作符。 比较表达式 所有类型都定义了大小比较顺序 numberatomreferencefunportpidtuplelistbinary 作用可以对存储了任何类型的列表进行排序并根据比较顺序编写高效的数据访问代码。 出了:,/外其他都遵循下面规则 如果一个比较参数为整数另一个浮点数 整数在比较前需要转换成浮点数。 如果两个比较参数都是整数或者浮点数直接比较。。。 只适用于浮点数和整数的比较。最好都用:。 下划线变量 如果一个变量在一个字句中只被使用一次编译器会提出警告。但以下划线开始那么编译器不会产生警告信息。 命名不准备使用的变量增加可读性。方便调试。 转载于:https://www.cnblogs.com/fvsfvs123/p/4241194.html