为了账号安全,请及时绑定邮箱和手机立即绑定

从字节数组读取/写入 32 位 32 位日期时间

从字节数组读取/写入 32 位 32 位日期时间

C#
海绵宝宝撒 2021-07-16 18:00:31
我正在尝试从字节数组中读取和写入 32 位日期时间值。我设法找到了 64 位版本。有谁知道一种简单的方法来做到这一点,但使用 32 位日期/时间?//Go from byte array to Time/Datelong utcNowLongBack = BitConverter.ToInt64(utcNowBytes, 0);DateTime utcNowBack = DateTime.FromBinary(utcNowLongBack);//Create 32 bit byte array from Time/DateDateTime utcNow = DateTime.UtcNow;long utcNowAsLong = utcNow.ToBinary();byte[] utcNowBytes = BitConverter.GetBytes(utcNowAsLong);根据https://msdn.microsoft.com/en-us/library/9kkf9tah.aspx
查看完整描述

2 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

自己进行位掩码和杂耍并不是非常棘手,但是如果您只想“使用现成的东西”,我认为最简单的方法是调用本机代码。


将两个组件一分为二UInt16,调用DosDateTimeToFileTime.


[DllImport("kernel32", CallingConvention = CallingConvention.StdCall, SetLastError = true)]

private static extern int DosDateTimeToFileTime(ushort dateValue, ushort timeValue, out UInt64 fileTime);


public static DateTime FromDosDateTime(ushort date, ushort time)

{

    UInt64 fileTime;

    if(DosDateTimeToFileTime(date, time, out fileTime) == 0) {

        throw new Exception($"Date conversion failed: {Marshal.GetLastWin32Error()}");

    }


    return DateTime.FromFileTime(Convert.ToInt64(fileTime));

}


查看完整回答
反对 回复 2021-07-17
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

一个结构来转换为/从 16 + 16 位日期/时间......显然使用按位运算!:-)


public struct DosDateTime

{

    public ushort Date;

    public ushort Time;


    public int Year

    {

        get => ((Date >> 9) & 0x7F) + 1980;

        set => Date = (ushort)((Date & 0x1FF) | ((value - 1980) << 9));

    }


    public int Month

    {

        get => (Date >> 5) & 0xF;

        set => Date = (ushort)((Date & 0xFE1F) | (value<< 5));

    }


    public int Day

    {

        get => Date & 0x1F;

        set => Date = (ushort)((Date & 0xFFE0) | value);

    }


    public int Hour

    {

        get => (Time >> 11) & 0x1F;

        set => Time = (ushort)((Time & 0x7FF) | (value << 11));

    }


    public int Minute

    {

        get => (Time >> 5) & 0x3F;

        set => Time = (ushort)((Time & 0xF81F) | (value << 5));

    }


    public int Second

    {

        get => (Time & 0x1F) << 1;

        set => Time = (ushort)((Time & 0xFFE0) | (value >> 1));

    }

}

这两个ushort Date和Time是由DOS FAT日期时间结构中使用“格式”(因为这是使用的格式,旧的FAT文件系统的一个)。各种属性由两个Date/Time字段“支持”并进行正确的按位计算。


查看完整回答
反对 回复 2021-07-17
  • 2 回答
  • 0 关注
  • 266 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信