1

このRuby on Rails helperには、次のメソッドがあります。

# 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.8で使用されていた char の ASCII 値ではなく、bアクセス時にRuby1.9 が出力するため、Ruby 1.9 では失敗します。"bla"[0]

問題のある行を次のように置き換えることができるはずです:

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 に答える