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()}");

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐