0

Ruby を使用しており、TCP インターフェイスからバイナリ データを読み込もうとしています。受信したメッセージには、ヘッダーとペイロードが含まれています。ペイロードは、ヘッダーの ID によって決定されます。

これは例です:

class TCPmessage < BinData:: Record

  class PayloadType_1 < BinData::Record
    uint8 :payloadType_1
    # more payload data
  end

  class PayloadType_2 < BinData::Record
    uint8 :payloadType_2
    # more payload data
  end

  uint8 :payload_id

  array :payload, :type => <<Here I need to select "PayloadType_1" or "PayloadType_2" based on the "payload_id" from above>>, ...

end

いくつかのバリエーションを試しましたが、次の解決策しか思いつきませんでした。

class TCPmessage < BinData:: Record

  class PayloadType_1 < BinData::Record
    uint8 :payload_id
    uint8 :payloadType_1
    # more payload data
  end

  class PayloadType_2 < BinData::Record
    uint8 :payload_id
    uint8 :payloadType_2
    # more payload data
  end

  uint8 :payload_id
end

メイン プログラムでは、最初にステートメントを読み取りpayload_id、次にcaseステートメントを使用して、次にインスタンス化するクラスを選択します。

x = TCPmessage.new
case x.read("TCPmessage").payload_id.to_s
when "1"
  y = TCPmessage::PayloadType_1.new
when "2"
  y = TCPmessage::PayloadType_2.new
end
y.read("TCPmessage")

BinData gem の複合型 (配列/選択肢) を使用した別のソリューションがあると確信していますが、それを見ることができませんでした。

4

2 に答える 2

0

あなたがやろうとしていることについて私たちが知っていることはほとんどないので、私はあなたがそれをしている方法に本当に悪いことは何も見ていません。

少し違った書き方をしますが、機能的にはそれほど大きな違いはありません。

x = TCPmessage.new
y = case x.read("TCPmessage").payload_id
    when 1
      TCPmessage::PayloadType_1.new
    when 2
      TCPmessage::PayloadType_2.new
    end
y.read("TCPmessage")
于 2012-11-02T16:33:28.223 に答える