5

私がこの構造を持っているとしましょう、

[StructLayout(LayoutKind.Explicit)]
public struct Chapter4Time
{
    [FieldOffset(0)]
    public UInt16 Unused;
    [FieldOffset(2)]
    public UInt16 TimeHigh;
    [FieldOffset(4)]
    public UInt16 TimeLow;
    [FieldOffset(6)]
    public UInt16 MicroSeconds;
}

そしてこの構造。

[StructLayout(LayoutKind.Explicit)]
public struct IEEE_1588Time
{
    [FieldOffset(0)]
    public UInt32 NanoSeconds;
    [FieldOffset(4)]
    public UInt32 Seconds;
}

ある構造から別の構造にどのように変換しますか?

4

1 に答える 1

6

ここで 2 つのオプション:

安全でないコードはありませんが、明示的な構造レイアウト

(これは C# コンパイラに関する限り安全ではありませんが、一部のフレームワークではまだ許可されていない可能性があることに注意してください - Marc Gravell のコメントを参照してください。)

ユニオン型を使用できます。これは、2 つのフィールドを持つ別の構造体であり、両方とも明示的に同じ場所に設定されます。構造を使用した完全な例を次に示します。

using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Explicit)]
public struct Chapter4Time
{
    [FieldOffset(0)]
    public UInt16 Unused;
    [FieldOffset(2)]
    public UInt16 TimeHigh;
    [FieldOffset(4)]
    public UInt16 TimeLow;
    [FieldOffset(6)]
    public UInt16 MicroSeconds;
}

[StructLayout(LayoutKind.Explicit)]
public struct IEEE_1588Time
{
    [FieldOffset(0)]
    public UInt32 NanoSeconds;
    [FieldOffset(4)]
    public UInt32 Seconds;
}

[StructLayout(LayoutKind.Explicit)]
public struct TimeUnion
{
    [FieldOffset(0)]
    public Chapter4Time Chapter4Time;
    [FieldOffset(0)]
    public IEEE_1588Time IEEE_1588Time;
}

class Test
{    
    static void Main()
    {
        var ch4 = new Chapter4Time { TimeLow = 100, MicroSeconds = 50 };
        var union = new TimeUnion { Chapter4Time = ch4 };
        Console.WriteLine(union.IEEE_1588Time.Seconds);
    }
}

安全でないコード、ポインタのキャスト

安全でないコードを使用できる場合の共用体型の代替は、型のポインターを にキャストするChapter4Time*ことIEEE_1588Time*です。

class Test
{    
    unsafe static void Main()
    {
        var ch4 = new Chapter4Time { TimeLow = 100, MicroSeconds = 50 };
        var ieee1588 = *((IEEE_1588Time*) &ch4);
        Console.WriteLine(ieee1588.Seconds);
    }
}

個人的には、可能な限りこれを行うことは避けたいと思いますが、*本当に、本当にやりたい場合は、これらがおそらく最も簡単な方法です。

于 2013-07-14T17:32:41.347 に答える