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

被折叠的 条评论
为什么被折叠?



