C#中C联合Union的实现

本文展示了如何在C#中使用StructLayout和FieldOffset属性模拟C语言的联合体,通过4个字节分别存储byte、int和float值。文中提供了一个示例程序,创建了两个联合体结构,用于演示数据在内存中的共享存储,并给出了运行结果,验证了数据转换的正确性。

c#实现c语言联合

参考代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Runtime.InteropServices;

namespace ConsoleApp2
{
    //定义4位联合体
    [StructLayout(LayoutKind.Explicit, Size = 4)]
    struct UninoCSharp
    {
        //设置联合体的每一位
        [FieldOffset(0)]
        public byte b0;
        [FieldOffset(1)]
        public byte b1;
        [FieldOffset(2)]
        public byte b2;
        [FieldOffset(3)]
        public byte b3;
        //得到对应的int值
        [FieldOffset(0)]
        public int i;
        //得到对应的float值
        [FieldOffset(0)]
        public float f;
    }

    //定义4位联合体
    [StructLayout(LayoutKind.Explicit, Size = 1)]
    struct UninoCSharpBYTE
    {
        //设置联合体的每一位
        [FieldOffset(0)]
        public byte b;
        [FieldOffset(0)]
        public sbyte sb;
        
    }



}

调用方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{

    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("c#联合演示");

            UninoCSharp abc = new UninoCSharp();
            
            abc.b0 = 1;
            abc.b1 = 2;
            abc.b2 = 3;
            abc.b3 = 4;

            Console.WriteLine("结果输出 " + abc.i.ToString());


            UninoCSharpBYTE a1 = new UninoCSharpBYTE();
            a1.sb = -20;
            Console.WriteLine("结果输出 " + a1.b.ToString());

            a1.b = 150;
            Console.WriteLine("结果输出 " + a1.sb.ToString());

            Console.ReadKey();

        }
    }
}

运行结果

4,3,2,1转换后验证

-20

 转换后对应

 150对应二进制

150转换后为-106

验证通过

特此记录

anlog

2023年2月9日 22点39分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值