erlang的二进制数据处理,binnary,及bit Syntax(语法)
Table of Contents
erlang 对于二进制的数据处理提供了非常强大的语法,而一般语言对于二进制数据的处
理多用移位操作来完成。
首先补充点基础知识,免得一会混乱了。
1 byte = 8 bit (1字节 === 8位) 1 int =4 byte = 32 bit(其他语言中 一般情况下int 类型为4字节,32位) 2^8 =256 (2 的八次方是256,) 似乎erlang 不区分int float ,
| hex | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c | d | e | f |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| binnary | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
所以一个十六进制字符需要4位(4bit)来表示,故一字节(byte)可以容纳2个十六进制字符,
故 16#ffffff 占3字节,24位,就不难理解了.
二进制,八进制,十六进制数的表示方法举例
| 二进制 | 八进制 | 十六进制 |
| 2#00001111 | 8#12345670 | 16#ff |
| 2#0010 | 8#123 | 16#ff0011 |
erlang 几个取size 的BIF(build in functions)
- size/1 返回字节数(byte为单位)
- bit_size/1 (返回位数,bit为单位)
bit syntax 重头戏
整数,
对于字母,数字转化成binary,可以进行这样的操作
(emacs@jf.org)77> A = <<12>>. <<"\f">> (emacs@jf.org)78> B = <<23>>. <<23>> (emacs@jf.org)79> C = <<257>>. % 大于256 <<1>> (emacs@jf.org)80> bit_size(A). 8 (emacs@jf.org)81> bit_size(C). 8 (emacs@jf.org)82>
| decimal | binary |
| 12 | 00001100 |
| 23 | 00010111 |
| 257(只取前8bit 00000001) | 0000000100000001 |
以上可见: 对于数字的情况:数字只能接受8bit 的数字,即小于256的数字(不包括256)
(emacs@jf.org)63> B= <<1,2,3,4>>. %B是二进制数据,32bit <<1,2,3,4>> (emacs@jf.org)64> <<C:32>> = B. %给整数C赋值 <<1,2,3,4>> (emacs@jf.org)65> C. 16909060 (emacs@jf.org)66>F = <<C:32>>. % int -->binary ,F是二进制 <<1,2,3,4>>
| decimal | binary |
| 1 | 00000001 |
| 2 | 00000010 |
| 3 | 00000011 |
| 4 | 00000100 |
| 16909060 | 00000001 00000010 00000011 00000100 |
对以上代码进行分析,可以得知如何从一个二进制数中截取出一个int 来,
及如何将一个int 值写到二进制数据中
字符,每个字符以其ascii 值来处理
(emacs@jf.org)110> A = <<"a">>. % 等效于 A = <<97>>. <<"a">> (emacs@jf.org)111> A. % A是二进制数据 <<"a">> (emacs@jf.org)112> <<B:8>> = A. <<"a">> (emacs@jf.org)113> B. % B是整数,8bit 97 (emacs@jf.org)114> bit_size(A). 8 (emacs@jf.org)115> size(A). 1 (emacs@jf.org)116> E = <<"ab">>. %等效于 E = <<97,98>>. <<"ab">> % 另外字符还可以这样表示 $a,$b,$c (emacs@jf.org)132> C = <<$a>>. <<"a">>
其他示例
(emacs@jf.org)127> A = <<1,2,3>>. <<1,2,3>> (emacs@jf.org)128> bit_size(A). 24 (emacs@jf.org)129> B = <<1,2,3:16>>. <<1,2,0,3>> (emacs@jf.org)130> bit_size(B). 32 (emacs@jf.org)131>
关于位数的控制
| 3:16 | ,16位的数字3 | 00000000 00000011 |
| 3 | 8位的数字3 | 00000011 |
二进制的表示方法,完全语法
- Value
- Value:Size
- Value/TypeSpecifierList
- Value:Size/TypeSpecifierList
- Value:Size
- 其中TypeSpecifierList可以是以下几种类型及其组合,组合以 - 相连
- Type(类型)
integer | float | binary | bytes | bitstring | bits | utf8 | utf16 | utf32
bytes= binary bits =bitstring
- Signedness (是否为有符号整数 + /-)
signed | unsigned
只有当Type 为integer 时有效,默认为unsigned
- Endianness(字节序) (default big)
- Unit
语法 unit:Integer ,如unit:1
取值范围1..257
integer,float,bitstring 1 binary 8 utf8 ,utf16,utf32, 不需要此属性 10> <<X1/unsigned>> = <<-44>>. <<"Ô">> 11> X1. 212 12> <<X2/signed>> = <<-44>>. <<"Ô">> 13> X2. -44 14> <<X2/integer-signed-little>> = <<-44>>. <<"Ô">> 15> X2. -44 16> <<N:8/unit:1>> = <<72>>. <<"H">> 17> N. 72 18> <<N/integer>> = <<72>>. <<"H">> 19> <<Y:4/little-unit:8>> = <<72,0,0,0>>. <<72,0,0,0>> 20> Y. 72
- Type(类型)
移位 and or 等传统操作
- bsl (Bit Shift Left),
- bsr (Bit Shift Right),
- band,
- bor,
- bxor,
- bnot.
示例 int32–>binary binary–>int32
将int32转换成binary ,从binary 头部读取32位,转成int32
-module(aaa).
-export([int32_2_binary/1,read_int32_from_binary/1]).
%%int按网络字节流 转成binary
%%网络传输一般采用大端序big,也被称之为网络字节序,或网络序
%%而erlang 默认就是big
int32_2_binary(Int) when is_integer(Int)->
<<Int:32>> ;
int32_2_binary(Bin) when is_binary(Bin) -> %若本就Bin ,直接返回
Bin.
%%默认binary 长度大于32
read_int32_from_binary(Bin) when is_binary(Bin)->
<<Int:32,_/bits>> = Bin,
Int
;
read_int32_from_binary(Int) when is_integer(Int) ->
Int.
%% aaa:read_int32_from_binary(<<"abcdefghijk">>).
%% 1633837924
%% 1100001 01100010 01100011 01100100
%% 97 98 99 100
%% a b c d