1

这个 Ruby on Rails 助手中,有以下方法:

# Convert an 8-bit or 16-bit string to an array of big-endian words
# In 8-bit function, characters >255 have their hi-byte silently ignored.
def str2binb(str)
    bin = []
    mask = (1 << $chrsz) - 1
    #for(var i = 0; i < str.length * $chrsz; i += $chrsz)
    i = 0
    while(i < str.length * $chrsz)
        bin[i>>5] ||= 0
        p 'i'
        p i
        p '$chrsz'
        p $chrsz
        p 'str[i / $chrsz]'
        p str[i / $chrsz]
        p 'mask'
        p mask
        bin[i>>5] |= (str[i / $chrsz] & mask) << (32 - $chrsz - i%32)
        i += $chrsz
    end
    return bin
end

运行时,出现此错误就bin[i>>5] |= (str[i / $chrsz] & mask) << (32 - $chrsz - i%32)行了:

ActionView::Template::Error (undefined method `&' for "J":String)

我不明白&在这种情况下如何使用。如何解决此错误?我正在使用 Rails 3.2.0 和 Ruby 1.9.2。

这是日志记录输出:

"i"
0
"$chrsz"
8
"str[i / $chrsz]"
"J"
"mask"
255
4

1 回答 1

4

我的猜测是该脚本在 Ruby 1.8 上运行,但在 Ruby 1.9 中失败,因为 Ruby1.9b在访问时输出,"bla"[0]而不是像过去在 Ruby1.8 中那样输出 char 的 ASCII 值。

您应该可以通过以下方式替换有问题的行:

bin[i>>5] |= (str.getbyte(i / $chrsz) & mask) << (32 - $chrsz - i%32)

ord改用:

bin[i>>5] |= (str[(i / $chrsz)].ord & mask) << (32 - $chrsz - i%32)
于 2012-08-06T04:16:00.497 回答