[原创]erlang二进制语法点滴

Erlang/OTP 17 [erts-6.0] [source] [smp:2:2] [async-threads:10]
[kernel-poll:false]

Eshell V6.0  (abort with ^G)
1>
<<100,200,300,400>>.
<<100,200,44,144>>
2>
<<100,200,300:16,400:16>>.
<<100,200,1,44,1,144>>
说明了一个segment默认是8位,高于8位的部分被截断

同理
1>
A = <<15768105>>.
<<")">>
2> io:format("~.16B",
[15768105]).
F09A29ok

16进制29是10进制的41,由此可以看出<<15768105>>其实等于<<41>>

但是
1>
<<41>> = <<15768105>>.
<<")">>
2>
<<15768105>> = <<41>>.
** exception error: no match
of right hand side value <<")">>
3>  <<1:1>>
= <<3:1>>.
<<1:1>>
4> <<3:1>> =
<<1:1>>.
** exception error: no match of right hand side value
<<1:1>>
5> <<5:2>> = <<13:2>>.
**
exception error: no match of right hand side value <<1:2>>
6>
A = <<15768105>>.
<<")">>
7> B =
<<41>>.
<<")">>
8> A =
B.
<<")">>

这些该如何解释呢?

-------------------------------------------------

&
基本形式:
Value:Size/TypeSpecifierList
TypeSpecifierList包括
Type(integer,
float, binary, bitstring),
Signedness(signed, unsigned),
Endianness(big,
little, native),
Unit(1-256)
e.g.

X:4/little-signed-integer-unit:8
<<X:4/big-signed-float-unit:16>>
= <<100.5/float>>.

&
默认值
类型默认为integer
Size的默认项:
integer默认8位,float默认64位
binary或bitstring处于尾部时默认匹配全部
Unit的默认项:
integer和float和bitstring为1,
binary为8
Signedness默认为unsigned
Endianness默认为big

&
词法注意
B=<<1>>需要写成B =
<<1>>
<<X+1:8>>需要写成<<(X+1):8>>
匹配时Value和Size必须是常量或已绑定的变量
下面的形式会报N
is unbound错,
foo(N, <<X:N,T/binary>>) ->
  
{X,T}.
正确的写法:
foo(N, Bin) ->
  
<<X:N,T/binary>> = Bin,
   {X,T}.

&
Unit
最好不要改binary和bitstring的Unit

&
语法糖
<<"hello">>是<<$h,$e,$l,$l,$o>>的语法糖

&
常用写法
取尾部的写法:
foo(<<A:8,Rest/binary>>)
->
foo(<<A:8,Rest/bitstring>>)
->
高效拼binary的写法:
triples_to_bin(T) ->
   
triples_to_bin(T, <<>>).

triples_to_bin([{X,Y,Z} | T], Acc)
->
    triples_to_bin(T,
<<Acc/binary,X:32,Y:32,Z:32>>);   % inefficient before
R12B
triples_to_bin([], Acc) ->
    Acc.

参照:http://www.erlang.org/doc/programming_examples/bit_syntax.html

[原创]erlang二进制语法点滴,码迷,mamicode.com

时间: 2024-10-24 02:12:14

[原创]erlang二进制语法点滴的相关文章

Erlang二进制模式匹配

Erlang的模式匹配用来处理二进制数据可谓是得心应手.不仅直观,而且超乎想象的简单.在C++中,处理二进制数据首先要管理缓冲区.然后再按字节进行操作,如果要处理的数据不是按字节对齐,则需要进行位移等操作.操作过程复杂又难懂,如果再没有注释,那对于维护这段代码的人来说简直就是噩梦.例如:操作一串保存了RGB颜色值序列的二进制串,在C++中要这样操作: struct RGB { char R; char G; char B; }; vector<RGB> rgbVector; for(int i

C++ 的二进制语法与语义

二进制的语法 C/C++ 默认数字使用十进制,八进制使用前缀 0, 十六进制使用前缀 0x 或 0X,二进制常数的提议被否决(引用 C 语言程序原理国际标准 的 6.4.4.1 章节字段 "A proposal to add binary constants was rejected due to lack of precedent and insufficient utility."),一直没有二进制的表示方法, GCC 使用 0b/0B 前缀作为扩展,其实很多编译器都有这个扩展的,

erlang二进制数据垃圾回收机制

erlang二进制数据在内存中有两种存在形式,当数据大小不到 64 bytes,就直接存在进程堆内.假设超过了64 bytes.就被保存到进程外的共享堆里,能够给节点内全部进程共享. erlang有两种二进制容器:heap binaries和refc binaries. heap binaries Heap binaries are small binaries, up to 64 bytes, that are stored directly on the process heap. They

Erlang基本语法汇总

一.Erlang语法:变量.模式匹配 -------------------------------------- 1.elr命令:工具栏toolbar:start(). 2.%...注释 3.变量首字母大写,单一赋值 4.模式匹配 5.原子:hello, 'an atom with' 6.元组tuple:元组嵌套{person,{a,1},{b,2}}              提取元组字段值Point = {point, 10, 45}  {point, X, Y} = Point 7.列表

erlang判断语法结构:if/case/guard

erlang 有好几种常用的判断结构语句,如 if.case.guard 等.文章将分别对 if / case /guard 的特点做介绍,以及用例说明 1.if 结构 [plain] view plaincopy if Condition 1 -> Action 1; Condition 2 -> Action 2; Condition 3 -> Action 3; Condition 4 -> Action 4 end Erlang是这样工作的:先对Condition 1求值,

Effective Erlang —— 二进制型的构造和匹配

在 R12B 中,构造和匹配二进制型最自然的方式比前版中的要快得多.你可用如下简单的代码来构造一个二进制型: 这么写(在 R12B 中)/求别这么写(在 R12B 之前的版本中) my_list_to_binary(List) -> my_list_to_binary(List, <<>>). my_list_to_binary([H|T], Acc) -> my_list_to_binary(T, <<Acc/binary,H>>); my_l

[Swift 语法点滴]——元组

注意:元组是否每一项加元组名非常重要,加与不加是完全不同的数据类型. 比如:var iPlayer=(name:"李逍遥",life:1000,attack:35) 将iPlayer传递给函数pk(a:(String,Int,Int),inout b:(String,Int,Int))中的参数就会出错. 解决方法: 统一元组中的项目名就行,都去掉或都加上

vim对erlang语法支持

发现vim写erlang代码语法缩进都不对,后来发现vim是7.0的,vim7.3开始才对erlang这块进行了支持,所以升级vim git上下载源码包,然后一系列配置安装 http://www.2cto.com/os/201212/176537.html http://www.linuxidc.com/Linux/2011-04/34594.htm ./configure --enable-netbeans --enable-multibyte --enable-fontset --with-

Erlang语言研究综述

摘 要: 本文前半部分主要是关于Erlang编程语言相关的内容:着重就一般学习编程语言的一般的关注点来阐述了Erlang编程语言的基本语法点,主要包括:Erlang的变量.Erlang的数据类型.Erlang的语句和Erlang编程语言的函数与模块四个方面:本文的后半部分主要就Erlang语言的并行化编程的实践:Erlang的并行化编程与Erlang并行化编程在矩阵乘积的实际应用,通过实践,可以发现,Erlang语言确实在并行化编程方面表现得很优秀. 关键词:并行计算:Erlang:编程语言:矩