C#共用体
C#没有共用体。
只能做到类似
using System;
using System.Runtime.InteropServices;// 方法1:使用显式布局
[StructLayout(LayoutKind.Explicit)]
public struct MyUnion
{
[FieldOffset(0)] public int Number;
[FieldOffset(0)] public float FloatNumber;
[FieldOffset(0)] public byte Byte1;
[FieldOffset(1)] public byte Byte2;
[FieldOffset(2)] public byte Byte3;
[FieldOffset(3)] public byte Byte4;
}// 使用示例
var union = new MyUnion();
union.Number = 123456789;
Console.WriteLine($"Float: {union.FloatNumber}"); // 共享同一内存位置
Console.WriteLine($"Bytes: {union.Byte1}, {union.Byte2}, {union.Byte3}, {union.Byte4}");
ip地址转换:
[StructLayout(LayoutKind.Explicit)]
public struct IPAddressUnion
{
[FieldOffset(0)] public uint Address;
[FieldOffset(0)] public byte Byte1;
[FieldOffset(1)] public byte Byte2;
[FieldOffset(2)] public byte Byte3;
[FieldOffset(3)] public byte Byte4;
public string GetIPString()
{
return $"{Byte4}.{Byte3}.{Byte2}.{Byte1}"; // 注意字节序
}
public void SetIPString(string ip)
{
var parts = ip.Split('.');
if (parts.Length == 4)
{
Byte1 = byte.Parse(parts[3]);
Byte2 = byte.Parse(parts[2]);
Byte3 = byte.Parse(parts[1]);
Byte4 = byte.Parse(parts[0]);
}
}
}// 使用示例
var ipUnion = new IPAddressUnion();
ipUnion.SetIPString("192.168.1.1");
Console.WriteLine($"IP as uint: {ipUnion.Address}");
Console.WriteLine($"IP as string: {ipUnion.GetIPString()}");