美文网首页
[Erlang开发之路]七、二进制型与位语法

[Erlang开发之路]七、二进制型与位语法

作者: 循环不计次 | 来源:发表于2019-07-17 16:05 被阅读0次

一、概念介绍

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]).

相关文章

网友评论

      本文标题:[Erlang开发之路]七、二进制型与位语法

      本文链接:https://www.haomeiwen.com/subject/mmmqlctx.html