Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用c语言将结构映射到内存,值得吗?还是有更好的办法_C#_Pointers_Struct_Marshalling_Unsafe - Fatal编程技术网

C# 用c语言将结构映射到内存,值得吗?还是有更好的办法

C# 用c语言将结构映射到内存,值得吗?还是有更好的办法,c#,pointers,struct,marshalling,unsafe,C#,Pointers,Struct,Marshalling,Unsafe,我通过网络发送一些数据包,它们以字节[]s到达,假设结构是 [int,int,byte,int] 如果这是C++,我会声明一个Stutt*并指向字节[]。我正在用c语言做这个项目,我不确定用编组开销是否值得,或者是否有更好的方法用c语言处理它,我洗耳恭听 为清楚起见,请更新 基本上,他在做什么 除非我想知道它是否值得。我认为封送是最好的选择。您可以自己使用解析字节数组,但这需要您做更多的工作,而且没有那么灵活。这样做的唯一真正原因是压缩系统的最后一点性能。在我看来,最好使用位转换器来编写它,以确

我通过网络发送一些数据包,它们以字节[]s到达,假设结构是

[int,int,byte,int]

如果这是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个以上字段非常麻烦。