我看到有些人只將日期存盤到 2 個位元組(ushort)!,而不是 4 個位元組(int)
假設格式yyyyMMdd: 20220521,適合 1 個短位元組和 1 個位元組。或僅 1 個整數。但是接下來的代碼我只是從反編譯的源代碼中復制了它。(不明白他是如何操縱位元的……)
在我看來。年份的最后一位數字可以是 1 位元組(2022 將存盤為 22 位元組) 月、日的縮寫為 1.... 但我未能像下面的示例那樣僅將其設為 2 位元組。
我什至不明白他們是如何實作的......我不明白下一個代碼是如何作業的。想知道他是怎么想的……
private byte[] PackDate16(DateTime date)
{
if (date.Year < 2000 || date.Year > 2127)
throw new Exception("Invalid year for a 16-bit date. Allowed values are 2010-2127");
ushort num = (ushort)(date.Year - 2000 << 9 | date.Month << 5 | date.Day);
return new byte[2]
{
(byte) ((uint) num & (uint) byte.MaxValue),
(byte) ((uint) num >> 8)
};
}
經過一番搜索......我找到了https://bytes.com/topic/net/answers/661377-c-program-convert-2-byte-time-2-byte-date-datetime
是否有任何位庫可以輕松做到這一點?
uj5u.com熱心網友回復:
如果你可以加減天數,那你為什么不用位來操作呢?
private static short CompressMe(DateTime value, DateTime minDate) =>
(short)((value - minDate).Days short.MinValue);
private static DateTime DeCompressMe(short value, DateTime minDate) =>
minDate.AddDays(value - short.MinValue);
例如:
DateTime minDate = new DateTime(2000, 1, 1);
// -24592
var result = CompressMe(new DateTime(2022, 5, 21), minDate);
// 6 June 2179
DateTime maxDate = DeCompressMe(short.MaxValue, minDate);
到目前為止,您可以將日期表示為short就像它們在
1 Jan 2000 .. 6 Jun 2179
時期
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/479577.html
