确定接收到哪种模式的任何方法
Any way to determine what kind of schema was received
我有以下两个模式。我通过套接字发送数据;收到后有什么方法可以确定发送的是哪一个?
namespace Objects;
table Login {
email:string;
password:string;
}
root_type Login;
file_identifier "LOGN";
namespace Objects;
table Register{
email:string;
password:string;
}
root_type Register;
file_identifier "REGR";
在一般情况下,不,FlatBuffers 是强类型的(不是自描述的),所以你必须知道你接收的是什么。
但是正如您的问题已经表明的那样,标记 FlatBuffer 二进制文件的一种便捷方法是使用 file_identifier
。您可以使用 BufferHasIdentifier
或任何生成的同名函数对其进行测试。
发送各种消息的更好解决方案是使用合并功能。
我找到了解决办法。
只是制定一个规则,int16 变量总是在每个数据包的顶部。像这样,
namespace Packets;
table Packet1 {
id:int16;
text1:string;
}
table Packet2 {
id:int16;
cost:int32;
text:string;
}
然后你可以从 bytes
中获取第一个 int16 值
golang 示例
tPos := flatbuffers.GetUOffsetT(packetBytes)
offset := flatbuffers.UOffsetT(flatbuffers.SOffsetT(tPos) - flatbuffers.GetSOffsetT(packetBytes[tPos:]))
offset = flatbuffers.UOffsetT(4) + offset
o := flatbuffers.UOffsetT(flatbuffers.GetVOffsetT(packetBytes[offset:]))
pos := tPos + o
id := flatbuffers.GetInt16(packetBytes[pos:])
switch id {
case 1:
fmt.Println("packet1")
case 2:
fmt.Println("packet2")
}
我有以下两个模式。我通过套接字发送数据;收到后有什么方法可以确定发送的是哪一个?
namespace Objects;
table Login {
email:string;
password:string;
}
root_type Login;
file_identifier "LOGN";
namespace Objects;
table Register{
email:string;
password:string;
}
root_type Register;
file_identifier "REGR";
在一般情况下,不,FlatBuffers 是强类型的(不是自描述的),所以你必须知道你接收的是什么。
但是正如您的问题已经表明的那样,标记 FlatBuffer 二进制文件的一种便捷方法是使用 file_identifier
。您可以使用 BufferHasIdentifier
或任何生成的同名函数对其进行测试。
发送各种消息的更好解决方案是使用合并功能。
我找到了解决办法。
只是制定一个规则,int16 变量总是在每个数据包的顶部。像这样,
namespace Packets;
table Packet1 {
id:int16;
text1:string;
}
table Packet2 {
id:int16;
cost:int32;
text:string;
}
然后你可以从 bytes
中获取第一个 int16 值golang 示例
tPos := flatbuffers.GetUOffsetT(packetBytes)
offset := flatbuffers.UOffsetT(flatbuffers.SOffsetT(tPos) - flatbuffers.GetSOffsetT(packetBytes[tPos:]))
offset = flatbuffers.UOffsetT(4) + offset
o := flatbuffers.UOffsetT(flatbuffers.GetVOffsetT(packetBytes[offset:]))
pos := tPos + o
id := flatbuffers.GetInt16(packetBytes[pos:])
switch id {
case 1:
fmt.Println("packet1")
case 2:
fmt.Println("packet2")
}