午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

C++中聯(lián)合體union套結(jié)構(gòu)體struct轉(zhuǎn)換為C#結(jié)構(gòu)體

 羊玉wngbx 2020-12-07

結(jié)構(gòu)體定義c++和c#基本差不多 只是C#沒有Union,下面是C++結(jié)構(gòu)體定義

struct{
    unsigned int ia;
    char iac[4];
    short ias[4];
}A;
struct{
    unsigned int ib;
    char iac[4];
    short ias[4];
}B;
struct{
    int index[3]
}C;
struct{
    unsigned int id;
}D;
//C++聯(lián)合體Union

union{
    A a;
    B b;
    C c;
    D d
}U;

或?qū)懗扇缦翪++聯(lián)合體Union定義

union{
    struct{
    unsigned int ia;
    char iac[4];
    short ias[4];
    }A;

    struct{
    unsigned int ib;
    char iac[4];
    short ias[4];
    }B;

    struct{
    int index[3]
    }C;

    struct{
    unsigned int id;
    }D;

}U;

C#中沒有聯(lián)合體Union,可以通過手動(dòng)控制結(jié)構(gòu)體每個(gè)元素的位置來實(shí)現(xiàn),這需要結(jié)合使用StructLayoutAttribute、LayoutKind以及FieldOffsetAttribute。使用時(shí)必須引用System.Runtime.InteropServices,下面用C#模擬C++中U的聯(lián)合

using System;

using System.Collections.Generic;

using System.IO;

using System.Text

using System.Runtime.InteropServices

namespace union

{

        public unsafe struct A

        {

            public ushort ia;

            public fixed char iac[4];

            public fixed short ias[4];

        }

        public unsafe struct B

        {

            public uint ib;

            public fixed char iac[4];

            public fixed short ias[4];

        }

        public unsafe struct C

        {

            public fixed int ix[3];

        }

        public struct D

        {

            public uint id;

        }

        //定義結(jié)構(gòu)屬性,結(jié)構(gòu)類型為精確定位,大小12字節(jié)

        [StructLayout(LayoutKind.Explicit, Size = 12)]

        public struct U {    

        [FieldOffset(0)]//結(jié)構(gòu)A定位在偏移0的位置

        public A a;

        [FieldOffset(0)]//結(jié)構(gòu)B定位在偏移0的位置

        public B b;

        [FieldOffset(0)]//結(jié)構(gòu)C定位在偏移0的位置

        public C c;

        [FieldOffset(0)]//結(jié)構(gòu)D定位在偏移0的位置

        public D d;

    }

}

也可以不定義U的Size,這時(shí)結(jié)構(gòu)體U的Size為U內(nèi)結(jié)構(gòu)最大

,默認(rèn)情況下,C# 不支持指針?biāo)惴ā?不過,通過使用 unsafe 關(guān)鍵字,可以定義可使用指針的不安全上下文。不安全代碼不一定是危險(xiǎn)的,只是其安全性無法由 CLR 進(jìn)行驗(yàn)證的代碼。在某些情況下,通過移除數(shù)組界限檢查,不安全代碼可提高應(yīng)用程序的性能。

  • 在 C# 中,為了編譯不安全代碼,必須用 /unsafe 編譯應(yīng)用程序。

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多