[erlang入门学习] erlang中的二进制数据处理

在网络编程中,我们面对的不再是字符串,而是字节流,对于这些信息的处理,erlang提供了比特语法这样的工具。

 

废话少说,看例子:

 

Eshell V5.8.4  (abort with ^G)
1> X = "hello".

 

先定义一个字符串变量X,下面把它变成二进制数据

2> BinX = list_to_binary("hello").
<<"hello">>

 

这里的 list_to_binary 是erlang的内建函数,专业术语叫 BIF ( Build-in Function),通过它,我们得到了一个二进制数据 BinX 。

字节流实际上就是一个二进制比特数组,相对应,直接将binary数据变回来的函数叫 binary_to_list:

3> binary_to_list(BinX).
"hello"

到此为止都很简单,下面看看 erlang  的魔力:

 

4> <<First:8,Body:24,Last:8>> = BinX.
<<"hello">>
5> First.
104
6> Body.
6646892
7> Last.
111
 

仔细看看,这不就是二进制版的模式匹配么(变量后面用冒号分隔的是截取的二进制数据位长度 )。经过这个变化后,First就存放了第一个字符(二进制数据前八位) ”h” 的ascii码,Last存放了最后一个字符(二进制数据的后八位) “o” 的 ascii 码,Body 有些不同,它对应了中间的 24 位(8位一个字节,三个字节就是24位)数据,因此看起来不像是一个 ascii 编码范围内的整数

 

现在把它们转变成字符串——

8> binary_to_list(First).
** exception error: bad argument
     in function  binary_to_list/1
        called as binary_to_list(104)
 

出现错误,为什么呢?

因为binary_to_list接受的是一个binary数据,而First本身已经是一个整数了,所以是参数错误,解决办法可以是这样

9> binary_to_list(<<First>>).
"h"
 

这样很麻烦,实际上,更好的办法是在模式匹配的时候就说清楚我们需要的是一个binary而不是integer,这一点erlang已经想到了,重新做一下是这样的——

10> <<First2:1/binary,Body2:3/binary,Last2:1/binary>> = BinX.
<<"hello">>
11> binary_to_list(First2).                                  
"h"
12> binary_to_list(Body2). 
"ell"
13> binary_to_list(Last2).
"o"

 

这里表示长度的数字有些变化,对于binary,它表示的是二进制字节数(之前是比特数)。

 

模式匹配的时候,如果最后一个变量长度为一个字节,那么是可以省略的——

14> <<First3:8,Body3:24,Last3>> = BinX.
<<"hello">>
 

另外补充一点:一开始使用比特匹配的时候常常会遇到下面的错误

15> <<First4:8, Body4:16, Last3:8>> = BinX.
** exception error: no match of right hand side value <<"hello">>

 

这是因为左侧的表达式总字节数与右侧不符(8+16+8 != 5 * 8 ),这一点需要多加注意,常见的情况是错误的估计了右侧变量的比特数。

 

附注:

完整的比特语法:
<<>> %%表示一个空的二进制数据
<<E1,E2,...,En>>

这里每一个 Ei 表示一个二进制数据区块。区块可能的形式有四种:

Ei = Value |

       Value:Size |

       Value/TypeSpecifierList |

       Value:Size/TypeSpecifierList
 

 

erlang 拼接二进制字符串 在Erlang中,可以使用 <<>> 运算符来拼接二... 阅读详情

相关推荐

erlang的汉字字符串和二进制的相互转换,并还原成汉字打印

测试: 1>...

SummerGao 1322

erlang实现字节数组反转和bit位反转

erlang实现字节数组反转和bit位反转

Fabuler的专栏 439

7、Erlang高级顺序编程:BIFs、二进制与位语法解析

本文深入解析了Erlang中的内置函数(BIFs)、二进制数据类型以及位语法的使用方法和应用场景。通过详细示例,介绍了它们在高效数据处理、协议编程及底层数据操作中的实际应用,帮助开发者提升Erlang顺序编程的能力。

vodka的博客 130

[Erlang 0024]Erlang二进制数据处理

在Erlang中写处理二进制数据的代码是洋溢着幸福感的,它对于二进制强大的表现力甚至能让你忘掉了它种种不便,今天我们说说Erlang的二进制数据处理。 Erlang中bit string代表无类型的内存区域,bit string 使用比特语法表达,如果bit string包含的数据位数是8的整数倍被称为二进制Binary数据.我们先从erlang shell中编写一系列demo开始,注意=号前后输

坚强2002@优快云 1612

深入理解Erlang的位语法与二进制处理

本文深入探讨了Erlang编程语言中位语法的使用,包括二进制数据的打包和解包技术。通过具体的代码示例,展示了如何在Erlang中使用位语法表达式创建和操作二进制数据,以及如何将复杂的二进制数据结构简洁地打包和解包。文章还提供了三个真实世界中的位语法使用案例,包括处理MPEG音频数据、构建Microsoft COFF格式的二进制数据文件以及解包IPv4数据报。

weixin_28888459的博客 293

深入Erlang的Sherlock项目:数据处理与功能扩展

本文深入探讨了Erlang编程语言中一个名为Sherlock的项目,该项目专注于处理和分析邮件数据。文章首先介绍了Sherlock如何对邮件进行分区、处理特定年份的数据,并生成相关数据文件。接着,文章讨论了项目中执行相似性查询和分面搜索的方法。最后,文章指出了Sherlock项目的扩展性,并提供了一系列的练习题目,鼓励读者在GitHub上为该项目做出贡献。

weixin_28888459的博客 339

Erlang中的二进制位串(2)

了解完 Erlang 的基本特性之后,就进入了基本语法的学习,但这部分着实让我费了点力气,因为和之前接触过的编程语言(C,C++,JAVA,C#)太不一样了,有很多新的理念,这儿我记录一下 Erlang 中一个很有特色的语言元素——二进制位串。 二进制串就是无符号8位字节序列,用于存放和处理数据块(通常是读自文件或通过某网络协议接收到的数据)。位串则是广义的二进制串,其长度不必是8的整数倍,如一

邱孝兵的博客 3641

Erlang端口通信与外部程序交互

本文将探讨Erlang中的端口通信机制,包括如何打开端口、端口能理解的消息格式、端口与外部进程的连接方式以及如何通过端口发送和接收数据。此外,还将介绍如何使用不同类型的端口设置,并通过Erlang和C程序示例展示端口在实际应用中的运用。

weixin_31938351的博客 338

erlang的二进制使用学习

最近因工作要求,需要使用erlang编程语言进行程序开发,不过一直没 有机会应用erlang的二进制使用,个人感觉erlang的二进制功能很强大, 但是里面有些知识点比较拗口,一不小心就模糊了相关的使用规则,下 面列出其使用方式以备忘记:   1.将一个整数强制拆分成指定长度的二进制表示:   1&gt;Bin =  &lt;&lt;17:15&gt;&gt;.   &lt;&...

iteye_2227的博客 357

Erlang中的模式匹配与函数定义

本文深入探讨了Erlang编程语言中的模式匹配技术,展示了如何在列表和元组中提取数据,并介绍了字符串在Erlang中的表示方式。文章还介绍了模块和函数的创建,解释了如何通过模块封装数据结构和功能,并通过函数定义实现模式匹配。最后,文章通过实例演示了如何在模块中添加测试代码,并强调了测试驱动开发的重要性。

weixin_28888459的博客 445

深入Erlang:位语法和位字符串的探索

本文将深入探讨Erlang中的位语法和位字符串,这是处理网络协议和位级数据的关键技术。我们将通过实际的代码示例,了解如何解析IPv4数据包的头部,以及如何通过模式匹配来提取位级数据。此外,我们还将探讨位字符串的存储机制,以及在Erlang中如何通过位推导式来操作位字符串。

weixin_36431145的博客 481

Erlang/OTP Getting Started 教程导读:从 Erlang Shell 到并发编程的快速入门路径

本文介绍 Erlang/OTP 系统文档中 [system/doc/getting_started](https://link.gitcode.com/i/86c10b8c2c2c3d809b521e0583d073f0) 章节的定位、前置要求、覆盖范围与学习路径。该章节是 Erlang 语言的快速入门教程,面向已具备一般计算机与编程基础、希望快速掌握 Erlang 顺序编程与并发编程核心概念的开

gitblog_00103的博客 414

逆向实战:手把手教你分析Google DroidGuard虚拟机的加密与反调试(附Python脚本)

本文深入解析Google DroidGuard虚拟机的加密机制与反调试策略,提供从环境配置到逆向分析的完整实战指南。通过IDA Pro、Frida等工具链,详细剖析DroidGuard的信号拦截、内存校验等保护机制,并附Python脚本实现自动化分析,助力Android安全研究人员突破GMS核心组件的安全防护。

weixin_32428571的博客 313

erlang 模块中函数学习

在Erlang语言的常见几种资料中,大多重点介绍语法及相关知识,对Erlang中的标准库函数的介绍很少。在编程时,总觉得不知道就没有底,今天就来了解下erlang模块中的函数。 erlang模块中的函数里,有一部分在交互式环境中是可以直接调用而不用带模块名的,但也有的在调用时必须带模块名,这个在erlt*.pdf 文档中有说明,文档中列出的函数带有“erlang:”前缀的,在调用时必须带模块名。

cloveses的专栏 617

别再只用串口助手了!用LabVIEW给STM32F103C8T6做个专属上位机(附完整源码)

本文详细介绍了如何利用LabVIEW为STM32F103C8T6开发定制化上位机,替代传统串口助手,实现高效数据交互。内容涵盖硬件架构设计、STM32固件优化、LabVIEW上位机开发技巧及工业级应用案例,特别适合需要实时数据采集与处理的工控场景。

weixin_42524762的博客 368

Windows 10下Carla 0.9.15安装避坑指南:从下载到运行的全流程解析

本文详细解析了在Windows 10系统上安装和运行Carla 0.9.15自动驾驶仿真平台的全流程。内容涵盖从系统环境准备、资源下载、Python依赖安装,到首次启动验证及常见错误(如DLL缺失、显卡驱动问题)的深度解决方案,旨在帮助用户快速搭建稳定的开发环境,并运行第一个自动驾驶Python脚本。

alice7model的博客 546

erlang语言的新特性和发展趋势

Erlang凭借其并发和容错核心,在新特性上持续优化性能和安全,发展趋势则指向云、IoT和AI融合。尽管面临竞争(如Go或Rust),但Erlang在特定领域(如高可用系统)仍有不可替代优势。建议开发者关注OTP更新,并通过Erlang社区论坛参与讨论。如果您有具体场景(如部署问题),我可以提供更针对性的建议!

2501_93582925的博客 834

避开内存陷阱:手把手教你用RKNN零拷贝接口正确管理输入输出Tensor

本文深入解析RKNN零拷贝接口在边缘计算中的高效内存管理策略,通过YOLOX实例演示如何避免内存对齐错误和数据错位。详细介绍了`rknn_tensor_mem`系列API的正确使用方法,包括内存创建、绑定、释放全流程,以及性能优化技巧如内存池技术和多核NPU负载均衡,帮助开发者提升推理效率并避开常见陷阱。

weixin_33686714的博客 160

[Erlang 0011] Erlang 杂记Ⅱ

学习Erlang的时候在书的留白处随手记录了一些东西,还有一些记录在了demo的注释里面,今天又整理出来了一部分,分享一下.  上一次的地址:[Erlang 0009] Erlang 杂记 Erlang属于面向消息的语言,面向消息的语言没有共享对象,进程间交互通过收发消息完成 Erlang中一个已经赋值的变量就是一个指针,指向存储值的存储区 单次赋值实际上就是存储区的值不会被修改 E

坚强2002@优快云 965

FreeRTOS任务调度实战:如何让STM32同时处理温湿度采集、OLED显示和云端通信

本文通过一个基于STM32的物联网终端项目,详细讲解了如何利用FreeRTOS实现多任务调度,同时处理温湿度采集、OLED显示和云端通信。文章深入探讨了任务规划、堆栈分配、信号量与消息队列等核心机制,并重点优化了ESP8266通信任务的非阻塞设计与稳定性,为构建响应迅速、运行可靠的嵌入式系统提供了实战指南。

weixin_29188043的博客 331

超详细版risc-v五级流水线cpu硬件设计实现解析

深入剖析risc-v五级流水线cpu的硬件架构与设计细节,涵盖指令流程、模块划分与关键时序控制,帮助理解risc-v五级流水线cpu的工作机制与优化策略。

weixin_42437253的博客 1633

Erlang List与字符串处理:RabbitMQ源码阅读必备基础

Erlang List作为函数式编程中的核心数据结构,其链表实现原理决定了头部操作高效、尾部追加需遍历的特性。在分布式系统开发中,List的模式匹配和高阶函数为消息处理、配置解析提供了强大的编程范式。列表推导式通过声明式语法实现数据转换与过滤,显著提升代码可读性。Erlang字符串本质是整数列表,虽统一了操作接口,但存在连接性能陷阱,而二进制字符串在IO密集型场景中更具优势。结合RabbitMQ源码实践,合理运用List与字符串处理技巧,能有效优化消息队列性能,避免常见内存泄漏问题。本文通过Erlang L

weixin_34413103的博客 498

十、Teigha.Net示例的源代码下载链接,以及英文的chm说明文件和相关案例

目录官方案例demo下载Teigha.net 英文版手册下载Teigha.net Entity实体中文翻译Teigha4.0 解决闪烁问题demo下载Teigha4.0 收录demo案例类似CAD看图王软件无AutoCAD环境下操作显示CAD文件的功能源码,整个示例模块源码 官方案例demo下载 在之前找到的官方案例3_03版本中包含32位与64位dll 其中的chm的说明文件内容也不完全,后面有更为详细的英文版的chm; 示例项目中,主要包括一个winfrom程序与控制台程序,OdWriteExMgd

... 3519

Erlang 基础学习 4 Advanced Sequential Programming

Day 4 Advanced Sequential Programming• BIF Build-In Functions,是在虚拟机里实现的,用erlang很难实现的功能,例如tuple_to_list,time等• Binaries 中的整数只能在0-255• term_to_binary,binary_to_term,list_to_binary• 位操作• M = &lt;&lt;X:3,...

阿干的个人博客 160

统计学习导论(ISLR) 第四章分类算法课后习题

统计学习导论(ISLR) 参考资料: The Elements of Statistical Learning An Introduction to Statistical Learning 统计学习导论(ISLR)(二):统计学习概述 统计学习导论(ISLR)(三):线性回归 统计学习导论(ISLR)(四):分类 ISLR统计学习导论之R语言应用(二):R语言基础 ISLR统计学习导论之R语言应用(三):线性回归R语言代码实战 ISLR统计学习导论之R语言应用(四):分类算法R语言代码实战 统计学习导论

阿里云专家博主、数据科学领域优质创作者、统计er在读 2万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: [转贴] 关于 bundle 的使用 - Gem Versioning and Bundler: Doing it Right
下一篇: [jruby] 建议替换数据库驱动,不再使用 jdbcxxx-adapter
freebuilder
博客等级 码龄20年 1粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值