我正在使用 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 中的复合类型(数组/选择)的解决方案,但我看不到它。