[Erlang]比特语法详解,看看你知道多少
来源:互联网 发布:webshell查杀工具 编辑:程序博客网 时间:2024/06/03 14:52
Erlang的比特语法(Erlang Bit Syntax)提供了一种方法来匹配二进制数据,这使得Erlang二进制对象在某种程度上等同于其他Erlang对象,如元组和列表。也因为其快速高效,使得在Erlang中,二进制对象被广泛使用,尤其是在协议编程方面。(官方文档)
Erlang的比特语法表达式:
- <<>>
- <<E1,...,En>>
每个元素Ei指定了一段二进制串(bit string)。每个元素Ei都是一个值,后面可以带有可选参数Size、TypeSpecifierList
- Ei = Value |
- Value:Size |
- Value/TypeSpecifierList |
- Value:Size/TypeSpecifierList
Size表示前一个Value数据存储的位数,默认是8位,也就是一个字节。
TypeSpecifierList可以是以下几种类型及其组合,组合以 - 相连
Type = integer | float | binary | bytes |bitstring | bits | utf8 | utf16 | utf32
默认值是integer。bytes是binary的简写,bits是bitsring的简写
Signedness = signed | unsigned
只有当type为integer时有用,默认是unsigned
Endianness = big | little | native
当type为integer,utf16,utf32,float有用,默认是big
Unit = unit:IntegerLiteral
有效范围是1-256,integer、float和bitstring默认是1,binary默认是8
例如:
- -define( UINT, 32/unsigned-little-integer).
- -define( INT, 32/signed-little-integer).
- -define( USHORT, 16/unsigned-little-integer).
- -define( SHORT, 16/signed-little-integer).
- -define( UBYTE, 8/unsigned-little-integer).
- -define( BYTE, 8/signed-little-integer).
- -define( CHAR, 1/binary-unit:8).
在官方文档找到以下一段代码:
1> Bin1 = <<1,17,42>>.<<1,17,42>>2> Bin2 = <<"abc">>.<<97,98,99>>3> Bin3 = <<1,17,42:16>>.<<1,17,0,42>>4> <<A,B,C:16>> = <<1,17,42:16>>.<<1,17,0,42>>5> C.426> <<D:16,E,F>> = <<1,17,42:16>>.<<1,17,0,42>>7> D.2738> F.429> <<G,H/binary>> = <<1,17,42:16>>.<<1,17,0,42>>10> H.<<17,0,42>>11> <<G,H/bitstring>> = <<1,17,42:12>>.<<1,17,2,10:4>>12> H.<<17,2,10:4>>
例子说明:
1、例子1和2:从一组常量或一个字符串来构造二进制对象
1> Bin1 = <<1,17,42>>.2> Bin2 = <<"abc">>.
以上生成的二进制大小为3。binary_to_list(Bin1) 得到 [1, 17, 42],binary_to_list(Bin2) 得到[97, 98, 99]。数字常量是在0-255之间的整数,用8位存储,如果超过这个范围后面加:Size来说明,如<<256:16>>。字符则会转化为ASCII码。
2、例子3:从一组限定边界的变量来构造二进制对象
3> Bin3 = <<1,17,42:16>>.
以上生成的二进制大小为4。
上面,我们给42指定了16位的大小来储存,所以在内存中的数据为0000 0000 0010 1010,这样构成出来的对象就是<<0, 42>>
3、例子4、6:按照某种形式匹配二进制对象
4> <<A,B,C:16>> = <<1,17,42:16>>.6> <<D:16,E,F>> = <<1,17,42:16>>.
例子4很好理解,这里说一下例子6吧,为何D会得到273的结果?
<<1,17,42:16>>生成的二进制数据前面说过了,为<<1,17,0,42>>
D:16表示匹配内存中16位的二进制数据,所以的到就是<<1,17>>在内存中的数据,为0000 0001 0001 0001,结果就是256 + 16 + 1,也就是273
4、例子11:也是从一组限定边界的变量来构造二进制对象,和例子3不同的是大小不是8的倍数。
<<1,17,42:12>>.
上面,我们给42指定了12位的大小来存储,所以在内存中的数据为0000 0010 1010,
这样构造出来的对象就是<<2,10:4>>
在erlang 二进制中,对象默认以8位为一个单位来表示,不足就在前面补位,比如:<<42:12,1,17>>补位后就是0000 0010 1010 0000 0001 0001 0001 生成的二进制对象就是是<<2,160,17,1:4>>,其实两者表达的是一段相同的二进制数据。
注意:
"B=<<1>>" 在erlang中被解释成 "B =< <1>>",这会引起一个语法错误“syntax error before: '<'”。正确的做法是写成 "B = <<1>>"
- [Erlang]比特语法详解,看看你知道多少
- erlang比特语法
- Erlang学习: 比特语法
- 比较全的Unix家族族谱(看看你知道多少)
- 比较全的Unix家族族谱(看看你知道多少)
- iOS面试题,看看你究竟知道多少(一)
- iOS面试题,看看你究竟知道多少(二)
- 多少比特能够杀死你
- 比特币疯长背后的区块链技术_你知道多少
- 比特币疯长背后的区块链技术,你知道多少
- sprintf,你知道多少?
- sprintf,你知道多少?
- sprintf,你知道多少
- sprintf你知道多少
- sprintf你知道多少
- spirntf,你知道多少?
- spirntf,你知道多少?
- spirntf,你知道多少?
- QML中的模型/视图--在QML中呈现数据
- OpenGL旋转
- 自定义回调 并将之以参数的形式传入
- 数据库 主从一致性检查和修复
- 使用mc-tool实现empathy的自动登录与处理密钥环问题
- [Erlang]比特语法详解,看看你知道多少
- eclipse经常未响应优化
- Python第四节FUNCTIONS学习汇总。
- STL系列之二 stack栈
- nginx动态数组ngx_array_t
- Solr之DIH配置(数据导入)
- Shell中脚本变量的作用域
- hdparm用法
- Unity3D面试题整合