1

そのため、c ++で記述されたレガシーアプリの置き換えに取り組んでおり、ネットワーク通信で使用される構造体をc#にマッピングする際に小さな問題が発生しました。基本的に、tcp接続のもう一方の端は次の構造体を使用して日付を書き込みますが、その構造体をac#datetimeにシリアル化することによって生成されたバイトを変換する方法がわかりません。それぞれ10ビットと6ビットで構成されている「ミリス」と「セカンド」に到達するまでは簡単で、2バイトが共有されます。値をバイト配列に読み書きするためにビットシフトでこれを解決すると思いますが、私はこれについての経験がありません。

typedef struct DATE_TIME
{
    USHORT  year;
    UCHAR   month;
    UCHAR   day;
    UCHAR   hour;
    UCHAR   minute;
    USHORT  millis : 10;
    USHORT  second : 6;
}

現在の読み取りの試行のコード

ushort Year = br.ReadUInt16();
byte Month = br.ReadByte();
byte Day = br.ReadByte();
byte Hour = br.ReadByte();
byte Minute = br.ReadByte();

ushort secAndMillSec = br.ReadUInt16();
ushort Milliseconds = (ushort)(secAndMillSec >> 6);
ushort Seconds = (ushort)((ushort)(secAndMillSec << 12)>>12);

書き込みでの最初の試行のコード

 bw.Write(Year);
 bw.Write(Month);
 bw.Write(Day);
 bw.Write(Hour);
 bw.Write(Minute);

 ushort secAndMillSec = (ushort)(Milliseconds << 6);
 secAndMillSec = (ushort)(secAndMillSec + Seconds);
 bw.Write(secAndMillSec);

再びそれは正しく見えますか?これまでのところ、実行できるすべてのテストデータは空の日付であるため、自分でテストする際に問題が発生しています。

4

2 に答える 2

0

ビットフィールドはコンパイラ間で移植可能ではありませんが、これら2つのフィールドは2つの結果として生じるバイトにあると想定できます。

ネットワークからストリームを受信して​​いて、日時を読み取っているところだと思います。

BinaryReader reader = new BinaryReader(networkStream);
int year = reader.ReadUInt16();
int month = reader.ReadByte();
int day = reader.ReadByte();
int hour = reader.ReadByte();
int minute = reader.ReadByte();
int ms = reader.ReadUInt16();
int second = ms >> 10;
int millist = ms & 1023;
DateTime dt = new DateTime(year, month, day, hour, minute, second, millis);
于 2012-07-25T04:28:52.883 に答える
0

先見者。私は同様のプロジェクトに取り組んでいました。私がしたことは、日時をJsonオブジェクトに変換し、それをC#にバイトとして送信し、C#からバイトをJsonとして読み取ることでした。C++ と C# の間の通信には Json を使用することをお勧めします。

于 2012-07-25T04:53:58.333 に答える