我需要将一个大的二进制字符串(一个字节序列)转换为ASCII table。我也可以从十六进制字符串开始。
我读过这篇文章:Converting binary data to string in ruby。我找到了一个转换为扩展ASCII表中字符的解决方案。我可以为每个案例编写条件以进行转换,但必须有一个更简单的方法。有人可以帮忙吗?
答案 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报告......