2011-08-03 14 views
2

"001 \" は最近、私はRubyで、このコードスニペットつまずい:ルビーInteger.chrに慣れていない文字列の使用状況や

"003 \ 003 \ 003 \ 003 \ 003 \" になり
@data = 3.chr * 5 

後で

flag = @data[2] & 2 

例のコードでは使用されている

、 私はそれはビットごとのフラグで何かのTODOを持っていることを知っています。値1,2と3が状態フラグとして使われているようですが、私がよく知っているバージョンであるruby 1.9がInteger.chrメソッドを変更したため、コードは機能しなくなりました。に。 さらに、 "\ 00x"エスケープされたものの目的は何ですか?あなたの答えのための

おかげ

答えて

4

にその行を変更してみてください、Ruby 1.9の内のコードを動作させるために:前のRuby 1.9、str[n]

flag = @data[2].ord & 2 

は0〜255の整数を返しますが、 Ruby 1.9では、新しいユニコードサポートで、str[n]は文字(長さ1の文字列)を返します。文字の代わりに整数を取得するには、文字に.ordを呼び出すことができます。

演算子は、C、Rubyおよび他の多くの言語に共通する標準的なビット単位のAND演算子です。

バイト番号3(0x03)は印刷可能なASCII文字ではないため、文字列にそのバイトがあり、inspectを呼び出すと、rubyは\003というバイトを表します。 「\ 003」はシングルバイト文字列、「\ 003」は4バイト文字列であることを理解してください。

Rubyでは、文字列は実際には一連のバイトです。 Ruby 1.9には、エンコード情報もありますが、実際は単なるバイト列です。

+0

正確に私が欲しかったのは、答え: – Markus1189

1

「\ 00X」は値の8進表現です。だから、

私たちがしなければ:私たちは17の右から20に行ってきましたか

irb(main):001:0> 15.chr 
=> "\017" 
irb(main):002:0> 16.chr 
=> "\020" 

は注意してください?オクタル

"\ 003 \ 003 \ 003 \ 003 \ 003"は値3の5バイトで、2または\ 002などの他のバイトとビット単位で入力できます。 2(0010)とANDバイナリで

だから、3

または0011

1.9問題は、1.8が行うようASCIIを使用していない1.9のアカウントで発生2(0010)です。 David Graysonはその点にうってつけです。

+0

8進数で、正確にはわかりませんが、私の意図ではありません。 – Markus1189

1

ルビ1に注意してください。図9は、16進表現で印刷できない文字を検査します:

3.chr # => "\x03" 

さらに混乱は時々、文字列がUnicode(UTF-8)に表示されるということです。

"\003" # => "\u0003" (utf-8) 
3.chr.encoding # => #<Encoding:US-ASCII> 
"\003".encoding # => #<Encoding:UTF-8> 
"\003" == 3.chr # => true (this is strange because the encoding is different) 

あなたはどのように理解しようとしている場合これらのオクタルと進文字列は、あなたがバイナリに変換することができ、数値を小数に関連:

"\003".unpack('B*') # same as "\003".ord.to_s(2) 
# => ["00000011"] # the 2 least significant bits are set 
2.to_s(2) # convert to base 2 
#=> "10" 

表現3 & 2は、ビット単位-とバイナリであります11bおよび10bの数字は10bをもたらす(なぜなら、1 & 1は最上位ビットのため1であるから、 1 & 0は最下位に0です)。

その他の変換:

'%x' % 97 # => '61' hex 
0x61 # => 97 decimal from raw hex input 
'%o' % 97 # => '141' octal 
0141 # => 97 decimal from raw octal input 

これは、クラッシュコースの一種ですが、あなたはおそらく、より詳細な情報のためのgoogleなければなりません。

+0

ビットの演算子を使って、本当に良い説明が得られました。 – Markus1189

関連する問題