好这里是一个想法一个计划,以适应你所需要的所有数据在你的56字节(事实上我们可以适应多达11个日期和时间到56字节):
假设你不希望这个系统持续超过一千年,我们可以将2013年的第一部分定义为2013年分为两个时间段和一年。
- 时期:5个比特(或一个字节),从而允许0-31
- 年份:7个比特(或一个字节),从而允许0-99
- 天:9位(两个字节),从而允许0-365
- 小时:5位(一个字节),允许0-24
- 二:12位(两个字节),允许0-3600
现在,你可以简单地使用7个字节,每递增的值,并会允许您存储多达8个日期和时间,但是你可以创建一个结构体,并将位单元的每个位进一步压缩以进一步压缩它,从而允许你将它分成40位(或者5个字节),并将它们分成11个日期。
你也可能下降时代,如果你真的临时抱佛脚,但上述方案将允许您使用日期工作高达3199.
我肯定还有其他的,更紧凑的方式,即毫秒数自01.01。 1970年以后说未来几年可能会减少几位,但会缩短代码的寿命,但我没有看到实际值。
一些示例代码(已经更新为使用BitArray为布尔内部是一个字节(?!),但BitArray实际上是位......在OPS情况:
OP应该注意,我认为很重要您希望存储每小时驾驶的分钟数量,但是这会需要更多的空间(每个小时的记录或每天的开始和停止记录,以指示他们开始和停止的分钟数(在开始后必须停止)。下面的代码将允许您记录在给定的一天中驾驶多少分钟。
using System;
using System.Collections;
namespace BitBangingDate
{
class Program
{
static void Main(string[] args)
{
CompactDateManipulator x = new CompactDateManipulator();
Console.WriteLine(x.ToString());
x.Month = 7;
x.Day = 27;
x.Minute = 1234;
Console.WriteLine(x.ToString());
var bitArr = x.GetCompactedArray();
CompactDateManipulator x1 = new CompactDateManipulator();//create new blank date to test whether can be reiitialised from BitArray
x1.ReinitialiseDateFromBitArray(bitArr);
Console.WriteLine(x1.ToString());
}
}
class CompactDateManipulator
{
CompactDate _date = new CompactDate();
public int Month
{
get
{
return BoolArrayToInt(_date.month);
}
set
{
IntToBoolArray(ref _date.month, value);
}
}
public int Day
{
get
{
return BoolArrayToInt(_date.day);
}
set
{
IntToBoolArray(ref _date.day, value);
}
}
public int Minute
{
get
{
return BoolArrayToInt(_date.minute);
}
set
{
IntToBoolArray(ref _date.minute, value);
}
}
public BitArray GetCompactedArray()
{
return _date.GetFullArray();
}
public void ReinitialiseDateFromBitArray(BitArray arr)
{
_date.SetDate(arr);
}
//utility methods
void IntToBoolArray(ref bool[] bits, int input)
{
var len = bits.Length;
for (int i = 0; i < len; i++)
{
bits[i] = (input & 1) == 1 ? true : false;
input >>= 1;
}
}
int BoolArrayToInt(bool[] bits)
{
if (bits.Length > 32) throw new ArgumentException("Can only fit 32 bits in a int");
int r = 0;
for (int i = 0; i < bits.Length; i++)
{
if (bits[i]) r |= 1 << i;
}
return r;
}
public override string ToString()
{
return String.Format("Stored Date mm/dd/ss: {0}/{1}/{2}", Month, Day, Minute);
}
}
class CompactDate
{
//Layout Month(5) Day(9) Minute (12)
// 11111 111111111 111111111111
public bool[] month = new bool[5];
public bool[] day = new bool[9];
public bool[] minute = new bool[12];
public BitArray GetFullArray()
{
int fullLen = month.Length + day.Length + minute.Length;
BitArray full = new BitArray(fullLen);
int index = 0;
for (int i = 0; i < month.Length; i++,index++)
{
full.Set(index,month[i]);
}
for (int i = 0; i < day.Length; i++, index++)
{
full.Set(index, day[i]);
}
for (int i = 0; i < minute.Length; i++, index++)
{
full.Set(index, minute[i]);
}
return full;
}
public void SetDate(BitArray arr)
{
int index = 0;
for (int i = 0; i < month.Length; i++, index++)
{
month[i] = arr.Get(index);
}
for (int i = 0; i < day.Length; i++, index++)
{
day[i] = arr.Get(index);
}
for (int i = 0; i < minute.Length; i++, index++)
{
minute[i] = arr.Get(index);
}
}
}
}
56个字节是房间的负荷......你只需要拿出某种形式的数据表示 –
的精选想那就是我,你能想到的办法?我是新来的这种类型的效率... –
看一看MSDN文章,我只是张贴在我下“更新”的答案 –