Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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#_C++_Bytearray_Struct - Fatal编程技术网

C# C语言中字节数组数据到结构的映射#

C# C语言中字节数组数据到结构的映射#,c#,c++,bytearray,struct,C#,C++,Bytearray,Struct,我已经为一个问题绞尽脑汁好几个小时了,所以我转过来看看是否有人知道如何解决这个问题。 我有一个传统的C++程序,它通过套接字发送数据包。这些包含C++结构,我认为在C语言应用程序中只定义一个结构类似C++中的结构,只需读取字节数组即可。 我注意到这并不是那么简单,我想我已经把问题归结为对齐问题,但我真的无法解决它 我的C++结构看起来像这样: typedef struct { int int_1; short short

我已经为一个问题绞尽脑汁好几个小时了,所以我转过来看看是否有人知道如何解决这个问题。 我有一个传统的C++程序,它通过套接字发送数据包。这些包含C++结构,我认为在C语言应用程序中只定义一个结构类似C++中的结构,只需读取字节数组即可。 我注意到这并不是那么简单,我想我已经把问题归结为对齐问题,但我真的无法解决它

<>我的C++结构看起来像这样:

typedef struct
{
    int                  int_1;
    short              short_1;
    long               long_1;
    char                char_11[11];
    long               long_2;
    short              short_2;
    int                  int_2;

} TEST_KLIENT_REC, *PTEST_KLIENT_REC;
[StructLayout(LayoutKind.Explicit, Pack=0)]    
public struct TEST_KLIENT_REC
        {
            [FieldOffset(0)]
            [MarshalAs(UnmanagedType.I4)]
            public int          int_1;          // 4
            [FieldOffset(4)]
            [MarshalAs(UnmanagedType.I2)]
            public short        short_1;        // 2
            [FieldOffset(6)]
            [MarshalAs(UnmanagedType.I4)]
            public int          long_1;         // 4
            [FieldOffset(12)]
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst=11)]
            public string       char_11;        // 11
            [FieldOffset(22)]
            [MarshalAs(UnmanagedType.I4)]
            public int          long_2;         // 4
            [FieldOffset(26)]
            [MarshalAs(UnmanagedType.I2)]
            public short        short_2;        // 2
            [FieldOffset(28)]
            [MarshalAs(UnmanagedType.I4)]
            public int          int_2;          // 4
        }
我想我可以把它翻译成这样的C结构:

typedef struct
{
    int                  int_1;
    short              short_1;
    long               long_1;
    char                char_11[11];
    long               long_2;
    short              short_2;
    int                  int_2;

} TEST_KLIENT_REC, *PTEST_KLIENT_REC;
[StructLayout(LayoutKind.Explicit, Pack=0)]    
public struct TEST_KLIENT_REC
        {
            [FieldOffset(0)]
            [MarshalAs(UnmanagedType.I4)]
            public int          int_1;          // 4
            [FieldOffset(4)]
            [MarshalAs(UnmanagedType.I2)]
            public short        short_1;        // 2
            [FieldOffset(6)]
            [MarshalAs(UnmanagedType.I4)]
            public int          long_1;         // 4
            [FieldOffset(12)]
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst=11)]
            public string       char_11;        // 11
            [FieldOffset(22)]
            [MarshalAs(UnmanagedType.I4)]
            public int          long_2;         // 4
            [FieldOffset(26)]
            [MarshalAs(UnmanagedType.I2)]
            public short        short_2;        // 2
            [FieldOffset(28)]
            [MarshalAs(UnmanagedType.I4)]
            public int          int_2;          // 4
        }
问题似乎在于C#如何映射为short(放入2字节的填充?),这会导致结构的其余部分对齐不良并创建垃圾数据。 有没有可能以某种方式实现这一点? 如果类使C#中的结构更容易使用,我不会对它感到困惑

当使用一些测试数据时,其结果似乎是int_1、long_1和short_1得到了正确的值,而其他的一切都是垃圾,这就是为什么我怀疑这里的问题是短路

任何想法都是非常受欢迎的

/J


编辑:至于为什么我用12而不是10来表示字符串偏移量,是因为字符必须从一个偶数双字开始,如果我用10来代替我认为应该是的(我知道我的数学,谢谢),我会崩溃无法从程序集“SocketAndStructTest,版本=1.0.0.0,区域性=中性,PublicKeyToken=null”加载类型“TEST\u KLIENT\u REC”,因为它包含偏移量为10的对象字段,该字段未正确对齐或与非对象字段重叠。“

您的
字段偏移量
没有按照您预期的方式排列。例如,在两个I_4和一个I_2之后,您有
FieldOffset(12)
,而我认为您需要
FieldOffset(10)


另外,我认为您需要将
[StructLayout(LayoutKind.Explicit)]
应用于
struct

6+4!=12,只是说:“至于检查,在C/C++和C++中做‘sieof’,并比较它们。我添加了一个编辑,说明为什么我不能使用更逻辑数的10。为什么你不使用C++结构中的长类型来匹配C++中的长类型?因为C++中长的是四字节长,这就转化为C中的INT32(int)。很抱歉,我有明确的部分,只是忘了把它复制到问题文本中。关于12对10,我对我的帖子做了一个简短的编辑。所以不要去那里。