将二进制(或十六进制)转换为ASCII

时间:2015-11-03 04:29:13

标签: ruby

我需要将一个大的二进制字符串(一个字节序列)转换为ASCII table。我也可以从十六进制字符串开始。

我读过这篇文章:Converting binary data to string in ruby。我找到了一个转换为扩展ASCII表中字符的解决方案。我可以为每个案例编写条件以进行转换,但必须有一个更简单的方法。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

您指定的链接包含在页面上执行转换的javascript代码,而不是模糊处理:

    function OnConvert()
    {
        hex = document.calcform.hex.value;
        hex = hex.match(/[0-9A-Fa-f]{2}/g);
        len = hex.length;
        if( len==0 ) return;
        txt='';
        for(i=0; i<len; i++)
        {
            h = hex[i];
            code = parseInt(h,16);
            t = String.fromCharCode(code);
            txt += t;
        }
        document.calcform.txt.value = txt;
    }

我不明白你的任务,因为如果你进入e。 G。 EEEFFA在表单中,您将获得îïú作为输出,在我看来,是扩展的ASCII。但是有一种简单的方法可以在ruby中实现相同的功能。

▶ "EEEFFA".scan(/[0-9a-f]{2}/i).map { |cp| cp.to_i(16) }.inject('', &:concat)
#⇒ "îïú"

UPD 正如我从评论中所理解的那样,您希望将每8个0和1转换为相应的ASCII字母。在这里(假设你有一个长字符串,包含零和一个):

▶ '010000010100001001000011'.
▷   scan(/[01]{8}/).          # allow only zeros and ones, scan by 8
▷   map { |e| e.to_i 2 }.     # convert to integers, base 10
▷   inject '', &:concat       # concatenate into one string
#⇒ 'ABC'

答案 1 :(得分:1)

@ mudasobwa优秀的解决方案略有不同,使用String#oct的(显然未记录的)功能:

'010000010100001001000011'
  .scan(/0[01]{7}/)
  .map { |b| b.prepend('0b').oct.chr }
  .join

十六进制,完整性:

'627e29397c5727611147503e36355a4f683737'
  .scan(/[0-7]\h/)
  .map { |x| x.prepend('0x').oct.chr }
  .join

如果有兴趣的话,我在ruby-lang打开了bug报告......