一、概念介绍
1.二进制型(Binary)
在Erlang中有一种变量类型(或者叫数据结构吧)叫二进制型,其实看起来就像是C++中的字节数组,表示形式如下:
- <<97,98,99,100>> = <<"a,b,c,d">>
每一个整数(为了顺口,下文将用字节代表整数的含义)的范围是0-255,超出255的作循环
2.位
每一位字节占8个位,所以对应地,整数类型变量占4个字节即32位,在Erlang中,位数是8的整数倍的称作二进制型binary,不符合规则的则称为位串bitString(表现形式的最小单元还是字节=-=别被骗了,还是要搞清楚位长度和字节长度的区别与联系)
二、位操作
1.输出
当二进制型内的成员是可以打印出来的字符时shell内将打印字符,存在一个不能打印的就只打印原始字节数据
2.二进制型的BIF(内置函数)
-
list_to_binary(L) - > B
参数L是list类型,举例:[Bin1,1,[2,3,Bin2],4|Bin3]
返回:相当于list去掉所有的[]再加上{} -
split_binary(Bin,Pos)->{Bin1,Bin2}
与大多数语言一样,索引都是从0开始
这句命令的含义是在Pos处一刀下去,把Bin切成Bin1和Bin2(Pos处的成员归Bin2) -
term_to_binary(Term)->Bin
任何一种Erlang数据类型都可以转变为Binary类型,这种转变可以通过网络发送再还原,或是保存本地下次加载等。 -
binary_to_term(Bin)->Term
term_to_binary的逆向函数 -
byte_size(Bin)->Integer
获取binary的字节长度(非位长度)
3.binary标准库
-
binary:at(Bin,Pos)->byte
返回指定位置的字节 -
binary:bin_to_list(Bin)->[bytes]
和binary_to_list函数一个作用 -
binary:bin_to_list(Bin, PosRange) -> [bytes]
PosRange是一个元组类型的变量,{S,E},S为开始的位置,E为结束的位置,函数的意义是将bin转为list并截取指定范围的字节 -
binary:bin_to_list(Bin,Pos,Len)
从Pos开始Len长度的binary成员转换成list -
binary:copy(Bin,Times)
将Bin复制Times份赋值出来 -
binary:first(Bin)/last(Bin)
获取第一\最后的字节 -
binary:longest_common_prefix([Bin1,Bin2])
返回列表二进制文件中二进制文件最长公共前缀的长度。 -
binary:longest_common_suffix([Bin1,Bin2])
最大公共后缀长度 -
binary:match(Bin,Bin2Find)
返回Bin2Find在Bin中的位置范围
Bin2Find可以是list,存放多个要找的Bin,存在多个结果时,函数只返回范围最长的一个 -
binary:matches(Bin,Bin2Find)
与matches差不多,但是返回一个List结果[{1,4},{5,6}]
Bin2Find中短的Bin是长的Bin子集时结果只返回最长的Bin的结果 -
binary:part(Bin,{S,E})(Bin,S,E)
截取S-E范围的binary成员出来形成新的binary -
binary:replace(Bin,[B1,B2..],Breplace)
将Bin中存在的B1....替换成Breplace -
binary:split(Bin,[Bin1,Bin2]\Bin1,[option])
以Bin1...作为分割界限分割Bin,同样Bin1...属于右边,当option不为global时,只以List中的第一个作分割界限
4.位语法与模式匹配
位语法表达式:
<<E1,E2....En>>
E1=Value | Value:Size | Value/Type | Value:Size/Type
举例:<<Head:32/bits>>
- Value
可以是整数、浮点数、二进制型的表达式
- Size
Value的位长度
- Type
表现形式为End-Sign-Type-Unit 任意一项都可以省略 都可以乱序, 都有默认值
a.End
包括了big、little、native
big:大端、也就是网络字节顺序,是默认值
little:小端
native:根据CPU自行确定
b.Sign
包括了signed和unsigned、用于匹配模式,默认unsigned
c.Type
类型,包括integer|float|binary|bytes|bitstring|bits|utf8|utf16|utf32 默认integer
d.Unit
写法:unit:1|2...256
integer、float和bitstring的Unit默认是1,binary是8。utfx类型无需提供值
附上《Erlang程序设计》第7章练习题个人见解:
-module(excise7).
-export([]).
reverseByte(Bytes)->%反转binary
list_to_binary(lists:reverse(binary_to_list(Bytes))).
term_to_packet(Term)->
Bstring=term_to_binary(Term),
Lstring=binary_to_list(Bstring),
Num = byte_size(Bstring),%数据长度
list_to_binary([<<Num:32>>|Lstring]).
packet_to_term(Packet)->
<<Head:32/bits,_/bits>> = Packet,
<<Size:32>> = Head,
Length=Size*8,%取bit长度
<<Head:32/bits,Data:Length/bits>>=Packet,
binary_to_term(Data).
reverseBits(Bits)->
lists:reverse([X||<<X:1>> <= Bits]).
网友评论