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写入文件,内部自动帮你处理转换细节。

文章转自庄周梦蝶  ,原文发布时间 2008-01-25

时间: 2024-09-20 16:26:16

Ruby处理二进制的相关文章

详细解析Ruby中的变量

这篇文章主要介绍了详细解析Ruby中的变量,是Ruby学习中最基础的知识之一,需要的朋友可以参考下 变量持有要使用的程序的数据的存储位置. Ruby支持的有五种类型的变量.在前面的章节中已经经历了一个简短描述以及这些变量.本章中介绍的这五种类型的变量. Ruby的全局变量: 全局变量以$开头.未初始化的全局变量的值是零,并使用-w选项产生警告. 全局变量的赋值会改变全局状态.这是不推荐使用全局变量.他们使得程序的含义模糊. 下面是一个例子显示使用全局变量. ? 1 2 3 4 5 6 7 8 9

详解Ruby当中的算数运算

  Ruby支持一系列丰富的运算符的一个现代化的语言.大多数运算符实际上是方法调用.例如,a + b的被解释为a, +(b)变量引用的对象的方法被称为一个用b作为它的参数. 对于每个运算符 (+ - * / % ** & | ^ << >> && ||), 有相应的赋值运算符缩写形式 (+= -= 等) Ruby算术运算符: 假设变量a=10,变量b=20: Ruby比较操作符: 假设变量a=10,变量b=20: Ruby赋值运算符: 假设变量a=10,变量

如何在Ruby中编写微服务?

[编者按]本文作者为 Pierpaolo Frasa,文章通过详细的案例,介绍了在Ruby中编写微服务时所需注意的方方面面.系国内 ITOM 管理平台 OneAPM 编译呈现. 最近,大家都认为应当采用微服务架构.但是,又有多少相关教程呢?我们来看看这篇关于用Ruby编写微服务的文章吧. 人人都在讨论微服务,但我至今也没见过几篇有关用Ruby编写微服务的.像样的教程.这可能是因为许多Ruby开发人员仍然最喜欢Rails架构(这没什么不好,Rails本身也没什么不好,但是Ruby可以做到的事还有很

《R和Ruby数据分析之旅》—第1章 1.1节Ruby

第1章 握住探险之鞭--认识Ruby R和Ruby数据分析之旅 <夺宝奇兵>一直是我最喜欢的系列电影.在我年少时,哈里森·福特就是我心中的英雄.我一直很喜欢印第安纳·琼斯抽鞭子的样子.其实正是在<夺宝奇兵>里,我第一次知道鞭子是什么东西. <夺宝奇兵>最早的两部--<法柜奇兵>和<魔域奇兵>中,印第安纳正值壮年,坚定刚毅,脾气暴躁.在我看过这两部之后,心里就对他标志性的帽子和鞭子产生了疑惑--为什么一定要戴那样一顶毡帽,为什么居然要拿一条鞭子?

写的一个inter类模仿ruby整数的行为

我们知道ruby中对于整数的[],[]=,<<,>>操作是针对于二进制的值来运算的. 我现在写一个针对十进制数操作的类,拥有整数的所有方法,如下:   class InterEx def initialize(val=0) @val=val end def to_s @val.to_s end def [](idx) self.to_s[idx].to_i end def []=(idx,val) s=self.to_s s[idx] = val.to_s @val=s.to_i

ruby查缺补漏

<Programming Ruby中文版>前3部分我并不准备细看,毕竟我接触ruby也有一段时间了,只准备快速地掠过一遍,查缺补漏:重点放在第3部分的核心内容上,至于第四部分的参考手册更多作为工具书了.仅在此记录下一些值的注意的东西. 1.全局变量$_,默认当gets方法返回输入的行时,同时保存在全局变量$_,并且正则表达式如果作为条件语句(if或者while)时默认是跟这个全局变量进行匹配,而print参数为空时也是打印这个全局变量.这是早期ruby向perl语言学习的结果.可以看看这个例子

ruby不会乘除法了,这是ruby1.9.3的bug吗?

问题描述 环境ruby1.8.7下irb(main):002:0> 0.011*100=> 1.1这是正常的.而在环境ruby1.9.3下irb(main):008:0> 0.011*100=> 1.09999999999999990.011 * 1000都不会有错,为什么乘100就出错呢?有哪位大侠能指点一下吗? 解决方案 用基于二进制的浮点数表示十进制小数,结果不正常才是正常的.所有使用IEEE 754浮点数标准的语言都有这个问题,跟Ruby本身无关.irb(main):001

Git系列(七):使用Git管理二进制大对象

通过这系列的前六篇文章,我们已经学会使用 Git 来对文本文件进行版本控制的管理.我们不禁要问,还有二进制文件呢,也可进行进行版本控制吗?答案是肯定的,Git 已经有了可以处理像多媒体文件这样的二进制大对象块(blob)的扩展.因此,今天我们会学习使用 Git 来管理所谓的二进制资产. 似乎大家都认可的事就是 Git 对于大的二进制对象文件支持得不好.要记住,二进制大对象与大文本文件是不同的.虽然 Git 对大型的文本文件版本控制毫无问题,但是对于不透明的二进制文件起不了多大作用,只能把它当作一

ruby 标准类型总结_ruby专题

一.数字 Ruby支持整数和浮点数,整数可以是任意长度 一定范围内的整数以二进制存放,它们属于fixnum类型,当超出这个范围时则自动转换为bignum类型 表达方式:符号+一串字符,数字串中的下划线会被忽略,(前缀包括:0表示八进制, 0x表示十六进制, 0b表示二进制)123_456_789_123_345_789 # Bignum0xaabb # 十六进制 也可以通过在前面加上问号来得到ASCII码字符对应的整数值和转义序列的值?a # 普通字符?\n # 换行符 (0x0a)?\C-a