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

位字段不能跨编译器移植,但我们可以假设这两个字段在两个后续字节中。

我假设您正在接收来自网络的流,并且您正在阅读日期时间。

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 读取。我更喜欢你使用 Json 在 c++ 和 C# 之间进行通信。

于 2012-07-25T04:53:58.333 回答