c# - 如何在 C# 应用程序中转换 C 结构?

标签 c# c structure pinvoke

我正在尝试在 C# 应用程序中使用来自 C DLL 的结构。我无法获得我正在处理的结构的等效数据类型。我正在处理来自 C 的这些数据类型:

struct teststruct {
    unsigned short protocol_type;       //c#'s UInt16 ?
    unsigned char hardwareSize;         //c#'s byte?
    UCHAR dest[6];                      //unsigned char and thus byte in c#?
    unsigned char ip_version : 4;       //How to get the exact same thing in c#?!!
    unsigned char Nonce_Sum_Flag: 1;    //the same as above
    unsigned char ip[4];                // !!
    unsigned short  in6_addr_src[8];    // !!
    char* astring;                      //string!?    
    char  anarray[10];                  //string? or char[]?
    const char* conststring;            //string? or array[] or char[]?   
};

对于结构本身,我认为要提前

[StructLayout(LayoutKind.Sequential)]

足够了。

这是我的 C# 结构;很明显,我坚持使用中间的两种和最后三种数据类型。我不知道如何处理它们!

[StructLayout(LayoutKind.Sequential)]
public struct teststruct
{
    public UInt16 protocol_type;                     //c's unsigned short ?
    public byte hardwareSize;                        //c's unsigned char?
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    public byte[] dest;                              //c's unsigned char ?
    unsigned char ip_version : 4;                    //How to get the exact same thing in c#?!!
    unsigned char Nonce_Sum_Flag : 1;                //the same as above
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    public byte[] ip;                                 // right?!
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
    public UInt16[]   in6_addr_src;                   // !!
    char* astring;                                    // !?    
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
    public byte[] anarray;                           //string? or char[]?
    const char* conststring;                         //string? or array[] or char[]?   
}

有人会特别建议我关于位分配的 C 独特概念吗?我的意思是这一行:

unsigned char Nonce_Sum_Flag: 1;

还有最后3个!

最佳答案

char* 使用 [MarshalAs(UnmanagedType.LPStr)]string

对于位域unsigned char ip_version : 4;,在c#中没有直接支持,你自己实现这个link可能有帮助。

关于c# - 如何在 C# 应用程序中转换 C 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22708647/

相关文章:

c# - 有没有办法在 C# 中以编程方式登录 amazon.com?

c - printf() 在命令行中重定向到文件 (Cygwin)

c - 指向 C 中字符串的字符数组的指针

C# ReadLine 转义回车/换行符?

c# - 你如何使用 MVC/Razor 封装 logic/html

c# - 如何使用 GE Winforms API 更改 KMLTreeView 中地标条目的图标

c - 我正在尝试为数组设置一个值,但我似乎无法弄清楚为什么我在第 31 行所做的事情是错误的

asp.net - 您如何在 Visual Studio 中构建 ASP.net 源代码?

C - 如何将(来自基于用户的输入)各种字符串存储在结构内的数组中?

html - 通过最佳实践组织和清理大型网站