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