在Ruby中将二进制编码的十进制(BCD)转换为ASCii

时间:2011-10-10 07:10:11

标签: ruby

我正在寻找将BCD转换为Ascii的ruby代码。我尝试过很多代码,但是我没有得到正确的结果。

有任何建议或代码示例吗?

3 个答案:

答案 0 :(得分:2)

我实际上是为这类事写了一个宝石。

https://rubygems.org/gems/bcd

源代码位于https://github.com/dafyddcrosby/ruby_bcd

答案 1 :(得分:2)

虽然这个问题已经很久了,但我刚刚处理过这个问题。假设你已经转换为bcd:

bcd_val.to_s(16)

这会将bcd值转换为十六进制,但因为每个半字节都是一个数字,并且所有数字都在0-9之间,所以它实际上显示为一个整数字符串。

请注意,如果您的bcd编号存储在LSB到MSB(取决于您转换为bcd的方式),则该编号将向后显示。此时,您始终可以根据需要使用 str.reverse

答案 2 :(得分:1)

目前还不太清楚你想做什么,但希望以下内容可以提供帮助:

def to_bcd(n)
  str = n.to_s
  bin = ""
  str.each_char do |c|
    bin << c.to_i.to_s(2).rjust(4,'0')
  end
  bin
end

def to_dec(bcd)
  n = ""
  (bcd.length / 4).times do |i|
    n << Integer('0b'+bcd[i*4..(i*4+3)]).to_s
  end
  n
end


result = to_bcd(120)
p result                  #=> "000100100000"
p to_dec(result)          #=> "120"
p to_dec(result).to_i.chr #=> "x"

如果您愿意,可以分别使用上面的两个方法扩展Integer和String类,不带参数,并用self替换参数名称。但有人不喜欢扩展标准类的想法,因为它不是一个干净/安全的编程习惯。