C# 用c语言将结构映射到内存,值得吗?还是有更好的办法
我通过网络发送一些数据包,它们以字节[]s到达,假设结构是 [int,int,byte,int]C# 用c语言将结构映射到内存,值得吗?还是有更好的办法,c#,pointers,struct,marshalling,unsafe,C#,Pointers,Struct,Marshalling,Unsafe,我通过网络发送一些数据包,它们以字节[]s到达,假设结构是 [int,int,byte,int] 如果这是C++,我会声明一个Stutt*并指向字节[]。我正在用c语言做这个项目,我不确定用编组开销是否值得,或者是否有更好的方法用c语言处理它,我洗耳恭听 为清楚起见,请更新 基本上,他在做什么 除非我想知道它是否值得。我认为封送是最好的选择。您可以自己使用解析字节数组,但这需要您做更多的工作,而且没有那么灵活。这样做的唯一真正原因是压缩系统的最后一点性能。在我看来,最好使用位转换器来编写它,以确
如果这是C++,我会声明一个Stutt*并指向字节[]。我正在用c语言做这个项目,我不确定用编组开销是否值得,或者是否有更好的方法用c语言处理它,我洗耳恭听
为清楚起见,请更新 基本上,他在做什么除非我想知道它是否值得。我认为封送是最好的选择。您可以自己使用解析字节数组,但这需要您做更多的工作,而且没有那么灵活。这样做的唯一真正原因是压缩系统的最后一点性能。在我看来,最好使用位转换器来编写它,以确保它正常工作。然后,如果获得数据是性能瓶颈,那么考虑进行封送处理。 例如,给定一个结构:
struct MyStruct
{
private int f1;
private int f2;
private byte f3;
private int f4;
public MyStruct(int i1, int i2, byte b1, int i4)
{
f1 = i1;
f2 = i2;
f3 = b1;
f4 = i4;
}
// assume there are public get accessors
}
然后,您可以使用以下命令从缓冲区创建一个新的缓冲区:
var s = new MyStruct(BitConverter.ToInt32(buff, 0),
BitConverter.ToInt32(buff, 4),
BitConverter.ToUInt8(buff, 8),
BitConverter.ToInt32(buff, 9));
这比封送更容易编写和验证,并且可能足够快满足您的需要。好吧,我想每个人都有自己“最喜欢”的方式。在任何OO语言中,当通过字节流接收协议单元时,我通常通过调用“bool addByte”方法将接收到的每个字节激发到“ProtocolUnit”类实例中。类中的状态机处理字节,错误/健全性检查组装的字段。如果ProtocolUnit已全部接收,addByte方法函数将返回true,以向调用方指示PDU已正确组装。通常情况下,实例会排队等待将要处理它的任何对象,并创建一个新的ProtocolUnit,或者说是depooled,这样它就可以开始组装下一个PDU了 这意味着可以识别消息的开头,以便在出现错误的情况下,状态机可以自行重置,从而转储错误数据,或者通过向addByte调用返回“true”,设置适当的errorMessage,调用方可以检查以决定做什么,例如,如果errorMess属性为queue to handler,则为queue to error logger 我确信你认为这是一个巨大的过度,但它对我来说是有效的: Rgds, 马丁
PS尽量避免在协议开始时传输长度,这是识别消息开始/结束的唯一方法。这是非常脆弱的,容易爆炸,特别是像UDP这样的非安全传输。即使使用TCP,我也知道x****x路由器偶尔会向数据包中添加null…作为位转换器的替代,将每个字节[]包装在内存流中,并使用二进制读取器提取字段。类似,但流为您保留偏移量。您将此字节数组传递给哪个函数?你能告诉我们剩下的代码吗?我很难理解你到底想完成什么。以及如何从包含字节的结构中获取字节[]。确保偏移量正确且具有可变长度数据和协议的4个以上字段非常麻烦。