KEEP K.I.S.S.

tk's blog

Ruby的字节操作

一个字节其实也就是一个整数,如果用十六进制表示的话,正好是两个十六进制数,用字符串表示就是 “HH”这样的表示。

Ruby的字节操作主要是靠两个方法来实现,String#unpack 和 Array#pack,两个类的实例方法,参数均为单一字符串。

举一个例子来讲解。

一般的 32位 Little-endian 机器上的单精度浮点数 float的一个实例: f = 88.888,得到它的字节表示 =>

因为字节操作需要 Array 类的 pack 操作,所以先把 f 放入一个数组实例中

 

irb(main):001:0> f = 88.888
=> 88.888
irb(main):002:0> s = []
=> []
irb(main):003:0> s << f
=> [88.888]
irb(main):004:0>

然后需要 pack 得到字符串表示

 

irb(main):004:0> s.pack("F")
=> "\xA8\xC6\xB1B"

也许会奇怪这个字符串为什么会这样,其实这里是 "\xA8\xC6\B1\x42",因为 \x42 正好是ASCII码表中 'B' 的十六进制代码,所以这里会显示成这样连着的。

然后我们得到字节的数值表示和十六进制表示:

 

irb(main):005:0> s.pack("F").unpack("C*")
=> [168, 198, 177, 66]
irb(main):006:0> s.pack("F").unpack("H*")
=> ["a8c6b142"]

还有一种方式:

 

irb(main):007:0> s.pack("F").unpack("C*").collect {|x| x.to_s(16) }
=> ["a8", "c6", "b1", "42"]

其实难点在于 pack 和 unpack 的操作,这个参数会很多,理解起来也有点难度,我觉得还是多用用就比较好理解了。

2011年和2004年,人生有记录就好

这是我看到CSDN上的一个帖子才写的,本人并不是当事人。

 

这是一个人2004年发的帖子,链接:http://topic.csdn.net/t/20040907/12/3347800.html

 

然后这是今年发的第二个帖子:http://topic.csdn.net/u/20111201/12/8ac8e816-86ca-4872-a68e-f2565038d856.html?38324

 

我只是想说,有情人终成眷属,真是不容易的事情。人生还是多点记录比较好,这样可以抗拒时间和逐渐衰老的记忆。

时光易逝,很多东西很珍贵,多用文字记录记录自己的生活吧。

Ruby 转换 Hex文本文件为二进制文件

用串口调试助手接受哦串口数据,貌似没找到怎么直接存储为二进制文件,所以用文本框显示十六进制字节流表示,然后存储(如果直接显示二进制会乱码,而且转换会丢失数据)。然后就写了个Ruby脚本来还原这个十六进制文本流。

 

filename = ARGV[0]
bytes = []
File.open(filename, "r") do |file|
  while str = file.gets
    bytes += str.split.map {|byte| byte.hex}
  end
end

puts bytes.count

newfilename = filename + ".bin"
File.open(newfilename, "wb") do |file|
  file.write bytes.pack("C*")
end

以前写的一些东西

  • 一个C++的矩阵模板类,带有常见运算和求逆等功能:Matrix.zip
  • 一个VC6.0写的右键打开菜单添加器,源码程序

 

也就这些了,以前放在GAE搭建的博客上,现在上不去了,而且GAE收费了,所以转移下。

命令行、脚本化、自动化以及其他

昨晚一个同学问了我一个问题,他跟着导师做项目,问为什么以及怎么去解析特定样式的命令行参数,比如

./DT -r rrr.txt -t ttt.txt -p 0 -s 5 

这里明显是为了脚本化和自动化用的,具体解析就不讲了,其实命令行参数设置可以参考 GNU 风格,比如上面的这个就可以写作

./DT -r,rrr.txt -t,ttt.txt -p,0 -s,5 

GNU 风格的好处在于明辨,参数项和参数值在同一个字符串中,用逗号分隔,进行解析时候就简便一些。命令行的函数好处在于便于使用管道(PIPE)和脚本来实现自动化,避免低效的手工和重复。

这段时间自己在看《程序员修炼之道》,非常好的一本书,感觉到自己有好多的不足,至少从怎么做一个卓有成效的程序员,来讲,我并没有明显的使用脚本去自动化去做一些事情,总是依赖GUI和手工。。。。

其实讲的很多内容并不是局限在编程这个领域,书中也是这么说的,学以致用,卓有成效的手段在各个领域都会有所用处。看来自己还是得不断努力了,不要再愚昧愚蠢的手工重复。。。。。

此书强烈推荐。