`

Ruby处理二进制

阅读更多
    分析二进制协议或者存取二进制文件是个很常见的需求,Ruby的IO提供了对二进制的读操作,但是写入却只提供字符。并且读的操作也比较笨拙,例如,在c里面的话,我们一般是定义个struct,然后:

fread(record, sizeof(record), 1, stream);

在java里,也是比较容易,特别是nio引入了ByteBuffer之后就更方便了。Ruby的话,我得自己确定读多少个字节,并自己“组装”成原始数据,这显然太麻烦了,幸好,我们有bit-struct :)
    到主页下载,解压之后参照README安装下就OK了。使用的话,也是先定义结构,然后new就行了:
require 'bit-struct'
class Message < BitStruct
    signed :msg_length,32
    char   :type,24
    signed :uid,32
    unsigned :cmd,16
    rest  :body
end
msg=Message.new
file.read(msg)
p msg.inspect
 
bit-struct支持float,char,unsigned,signed,text,pad,nest,oct,hex,其中nest用于声明一个嵌套结构,例如:
class Sub < BitStruct
    unsigned :x,    8
 end

class A < BitStruct
    nest    :n,  Sub
end

a = A.new
p a  # ==> #<A n=#<Sub x=0>>
 
如果你看下源码的话,会发现BitStruct继承String类,因此IO可以直接将BitStruct写入文件,内部自动帮你处理转换细节。

0
0
分享到:
评论

相关推荐

    ruby的二进制字符串与hex互转,二进制字符串与整数互转的工具函数

    本资源是ruby代码,提供了一系列封装好的函数,用于快速进行转换,一个函数搞定,包括如下转换,二进制字符串与hex字符串的互转。...这些工具函数对于要处理二进制字符串时很好用,是我多年的积累。

    windows下安装Ruby 1.9 二进制zip包

    总结起来,安装Ruby 1.9的二进制zip包主要涉及下载、解压、配置环境变量和处理依赖。这些步骤对于不熟悉编译环境的用户来说,比从源码编译要简单得多。然而,务必注意保持Ruby及其依赖库的更新,以确保系统的安全性...

    rubyx:RubyX将ruby编译为二进制(以ruby),希望能够快X倍

    换句话说,将ruby编译为二进制。 根据心态的不同,X的读取速度可以快X倍或十倍。 上一次重写澄清了系统不同层的作用,请参见下文。 检修完成,rubyx生成有效的二进制文件。 处理过程通过以下层进行:Ruby-&gt; Sol-...

    ruby-binary-parser:一个优雅的 Ruby-Gem 库,用于解析二进制数据

    Ruby 二进制解析器Ruby-Binary-Parser 是Ruby Gem 库,提供用于解析二进制数据的DSL,例如Image 文件、Video 文件等。无需对字节和位进行复杂的操作,您可以通用和抽象地解析和读取二进制数据。描述该库可以解析所有...

    binary_search:Ruby中的二进制搜索

    以下是对二进制搜索算法及其在Ruby中的应用进行的详细解释。 二进制搜索的基本思想是通过不断地将搜索区间减半来快速定位目标元素。其步骤如下: 1. **初始化**:给定一个已排序的数组和要查找的目标值。 2. **...

    ruby-使用ruby进行位操作-bit-manipulation.zip

    这种技术在处理二进制数据、优化性能或实现特定算法时非常有用。本教程将深入探讨Ruby中的位操作,以及如何在实践中应用它们。 1. **位运算符** - **按位与(&)**:两个数对应位都是1时结果为1,否则为0。 - **按...

    crystal-binary_parser:用于Crystal的二进制解析器

    在现代软件开发中,处理二进制数据是必不可少的,尤其是在网络通信、文件解析、低级系统编程等领域。本文将详细介绍 `Crystal-binary_parser` 的核心概念、用法以及如何在实际项目中利用它来解决具体问题。 ### 1. ...

    homebrew-tap:自制公式转换为二进制

    当创建一个二进制tap时,开发者需要编写额外的Ruby脚本来处理二进制包的下载、校验和安装。这些脚本必须遵循Homebrew的API和最佳实践,确保与Homebrew的其余部分无缝集成。 压缩包子文件的文件名称列表中的...

    kaitai_struct:Kaitai Struct:使用C ++ C#生成二进制数据解析器的说明性语言Java JavaScript Lua Perl PHP Python Ruby

    它的核心理念是提供一种声明性语言,使得开发者可以描述二进制数据的结构,然后自动生成针对多种编程语言的解析代码,包括 C++、C#、Java、JavaScript、Lua、Perl、PHP、Python 和 Ruby。这极大地简化了二进制数据...

    ruby语言帮助文当

    这个版本带来了许多性能改进和新特性,例如引入了“关键字参数”来增强函数调用的清晰度,以及“二进制字符串”类型,使得处理二进制数据更加便捷。此外,Ruby 2.0还引入了垃圾回收的改进,提升了程序运行效率。 ...

    convertSTL:在ASCII和二进制编码之间转换STL文件的实用程序

    用于在ASCII和二进制编码之间转换STL文件的实用程序。 我写这是为了节省处理STL文件时的磁盘空间和带宽。 某些建模程序包括此功能,但是最好具有更轻量的功能,并且可以从命令行调用它。 用法 $ ruby convertSTL.rb...

    bakeware:将Elixir应用程序编译为易于分发的单个可执行二进制文件

    标题中的“bakeware”是一个工具,它允许Elixir开发者将他们的应用程序编译成一个单一的、可执行的二进制文件。这样的二进制文件在分发和部署时具有诸多优势,比如简化安装过程,提高运行效率,以及增强安全性。在...

    Ruby-RubyCompiler针对Ruby设计的AOTAOT编译器

    通过预编译Ruby代码,可以将程序转换为高效的二进制形式,这在需要高性能、低延迟的场景下尤为重要,例如服务器端的应用、科学计算或者游戏开发。 Ruby Compiler的实现通常涉及以下几个关键步骤: 1. **词法分析**...

    holy-build-box:用于构建跨发行版Linux二进制文件的系统

    用于构建跨发行版Linux二进制文件的系统 Holy Build Box是一个用于为Linux构建“便携式”二进制文件的系统:这些二进制文件几乎可以在任何Linux发行版上工作。 通过提供带有旧glibc版本的易于使用的编译环境来工作...

    binary_search_tree:用Ruby实现的二进制搜索树

    二叉搜索树(Binary Search Tree,BST)是...总的来说,二叉搜索树在处理有序数据时非常有用,尤其适用于快速查找、插入和删除操作。Ruby作为动态语言,提供了简洁的方式来实现这样的数据结构,便于在实际项目中应用。

    Ruby1.9.1released.zip

    ruby 1.9.1 的下载地址是:ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p0.tar.gz (windows上在http://www.ruby-lang.org/en/downloads/ 下载二进制的文件)另外,目前Rails 2.2还无法在ruby 1.9.1上面正常...

    Ruby-Http2HTTP2协议的纯Ruby实现

    1. **二进制分帧**:HTTP/2将HTTP请求和响应分解为一系列二进制数据帧,每个帧都有自己的头部,用于标识帧类型、目标流ID等信息。这种设计允许并发处理多个请求和响应,提高了连接效率。 2. **头部压缩**:HTTP/2...

    ruby mail资料

    3. **附件处理**:Ruby Mail 支持添加和处理邮件中的附件,无论是文本文件、图像还是其他类型的二进制文件。它可以处理 MIME 类型,并将附件编码为适合在网络上传输的形式。 4. **SMTP 发送**:Ruby Mail 可以通过 ...

    Ruby-TZInfoRubyTimezone库

    在压缩包`tzinfo-tzinfo-3fc5f9c`中,很可能包含了TZInfo库的源代码或者特定版本的二进制文件。如果要使用这个库,你需要将其正确地安装到你的Ruby环境中,通常通过Gem管理器进行: ```bash gem install tzinfo ```...

    Darkart:二进制接口让Chez Scheme使用Python,Lua,Ruby等的库

    这时,Darkart就扮演了桥梁的角色,它为Chez Scheme提供了与这些语言的二进制接口,使得在Scheme中调用它们的库成为可能。 首先,理解Darkart的核心理念:它是一种“二进制接口”(Binary Interface)。在传统的跨...

Global site tag (gtag.js) - Google Analytics