1

RubyDocを調べました。しかし、実際のプログラミングで以下の3つがどのように使用されるかを理解するのに十分なコードはありません。

@、、。X_x

誰かが簡単なスニペットでそれを説明できますか?

ありがとう

4

1 に答える 1

5

私はあなたにいくつかの例を挙げ、あなたと一緒に学びます:

[1,2,3,4].pack("CCCC")
=> "\x01\x02\x03\x04"

したがって、unsignedcharsでシリアル化します。新しいバイトのすべての文字。

[1,2,3,4].pack("CCXCC")
=> "\x01\x03\x04"
[1,2,3,4].pack("CCXXC")
=> "\x03"

'X'をバックスペースディレクティブと考えてください

[1,2,3,4].pack("CCxC")
=> "\x01\x02\x00\x03"
[1,2,3,4].pack("CCxxC")
=> "\x01\x02\x00\x00\x03"

'x'はゼロ値のバイトを配置します。

[1,2,3,4].pack("CC@C")
=> "\x01\x03"
[1,2,3,4].pack("CC@@C")
=> "\x01\x03"
[1,2,3,4].pack("CC@@CC")
=> "\x01\x03\x04"
[1,2,3,4].pack("CC@CC")
=> "\x01\x03\x04"
[1,2,3,4].pack("CC@C@C")
=> "\x01\x04"
[1,2,3,4].pack("CC@C@@C")
=> "\x01\x04"

'@'は単一のバックスペースのようですが、一度に複数の操作をサポートすることはありません。説明としての最後のものは、ドキュメントのテキストとはまったく関係ありません。

@絶対位置に移動します

しかし、それはそれがしているように見えることです。

編集ところで:@のコンテキストで見ると、はるかに論理的に見えますunpack

[1,2,3,4,5].pack("CCCCC").unpack("CCC@CCCCC@CC")
=> [1, 2, 3, 1, 2, 3, 4, 5, 1, 2]

最初からもう一度開梱を開始します。

EDIT2そしてここに、解凍のコンテキストでの他の2つのディレクティブの説明があります。

[1,2,3,4,5].pack("CCCCC").unpack("CCCXC")
=> [1, 2, 3, 3]
[1,2,3,4,5].pack("CCCCC").unpack("CCCXXC")
=> [1, 2, 3, 2]
[1,2,3,4,5].pack("CCCCC").unpack("CCCxC")
=> [1, 2, 3, 5]

したがって、「x」は次のデコードバイトを無視し、「X」は前のバイトを次のバイトにしてもう一度読み取ります。「X」はスタックできます。

結果を要約する最初の試みは次のとおりです。

pack

  • 'x'はゼロバイトを配置します
  • 「X」はバックスペースディレクティブのように機能します。つまり、前のバイトは実際にはパックされません。
  • 「@」は私には説明できない振る舞いをします

unpack

  • 'x'解凍用の次のバイトをスキップします
  • 「X」はリーダーを後方に移動します。つまり、最後に読み取られたバイトがもう一度読み取られます。
  • '@'は、リーダーを最初に移動します。これは、すべてのバイトがもう一度解凍されることを意味します。

リーダーは、説明を簡単にするために私が作成した単語であり、決して正式なものではありません。

EDIT3ここに「\x01」表記の説明もあります:

a = [17, 22, 31]
=> [17, 22, 31]
a.pack("CCC")
=> "\x11\x16\x1F"

これは16進表現の略のようです。そして、私がリンクしたすべてのサイトは、明らかに小数表現を使用しています。それ以外の場合は、ご覧のとおり、これらは指定された数値の16進表現です。

于 2013-01-12T16:22:43.533 に答える