4

C# サーバーと通信する C++ クライアントがあり、ユーザー定義型のカスタム シリアル化があります。

ここで、日付と時刻の構造体を C++ から C# に渡す必要があります。グーグルは次のアプローチにつながりました:

  1. SYSTEMTIME 構造体に日付/時刻を入力します (これは現在のシステム時刻ではありません。特定の条件に基づいてプログラムによって埋められます)。
  2. SYSTEMTIME を FILETIME に変換する
  3. FILETIME を __int64 に変換します (これにより、1601 年 1 月 1 日からの 100 ナノ秒間隔を表す 64 ビット値が得られます)
  4. C# の DateTime のコンストラクターでこの 64 ビット値を使用します。

水域をテストするためだけに、ステップ 1、2、3 を実行する (ネイティブ) C++ とステップ 4 を実行する C# の 2 つのスニペットを作成しました。C++ から C# への自動呼び出しはまだありません。

ステップ 3 の値 (130220830133980000L) を手動で取得し、C# で使用しました。これがコード スニペットと出力です。

C++ コード

SYSTEMTIME st;

GetSystemTime(&st);

printf("\n In C++ : %04d:%02d:%02d:%02d:%02d:%02d:%03d\n", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);

FILETIME fileTime;
if(!SystemTimeToFileTime(&st, &fileTime)) {
    wcout << "Conversion from system time to file time failed. Error : " << GetLastError();
}

__int64 ticks = (((ULONGLONG) fileTime.dwHighDateTime) << 32) + fileTime.dwLowDateTime;

C# コード

DateTime dob = new DateTime(130220830133980000L, DateTimeKind.Utc);
Console.WriteLine("In C# : " + dob.Year + ":" + dob.Month + ":" + dob.Day + ":" + dob.Hour + ":" + dob.Minute + ":" + dob.Second + ":" + dob.Millisecond);

出力:

C++ の場合: 2013:08:27:13:16:53:398

C# の場合: 413:8:27:13:16:53:398

年の部分を除くすべての値を正しく取得できます。C++ の 2013 年は、C# では 413 になります。年の部分が変わる理由がわかりません。

変換を正しく行っていますか? C++ から C# に、またはその逆に日付と時刻の情報を渡す別の方法はありますか?

4

1 に答える 1