Okay здесь идея схему для размещения всех данных, которые вам нужны в ваших 56 байтах (на самом деле мы можем вместить до 11 дат и времени в 56 байт):
Предполагая, что вы не ожидаете, что эта система продлится более тысячи лет, мы можем определить первую часть года, то есть 2013 год делится на две, эпоху и год.
- Эпоха: 5 бит (или один байт), что позволяет 0-31
- Год: 7 бит (или один байт), что позволяет 0-99
- день: 9 битов (два байта), позволяющие 0-365
- час: 5 бит (один байт), что позволяет 0-24
- Второе: 12bits (два байта), что позволяет 0-3600
Теперь вы можете просто использовать 7 байт и увеличиваем значения каждого и будет позволяют хранить до 8 дат и времени, но вы могли бы создать структуру и бит бит отдельные биты, чтобы скомбинировать его далее, позволяя вам втиснуть его в 40 бит (или 5 байтов), имея 11 дат.
Вы также можете отказаться от эпохи, если вы действительно зубрежки, но выше схема позволит вам работать с датами ДО 3199.
Я уверен, что есть другие, более компактные способы, т.е. количество миллисекунд, прошедших с 01.01. 1970, чтобы сказать, что несколько лет в будущем могут сократить его на несколько бит, но уменьшить долговечность вашего кода, но я не видел реальных значений.
Некоторые примеры кода (Были обновлены для использования в качестве BitArray BOOL внутренне байт (?!), но на самом деле 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, которую я только что опубликовал в своем ответе в разделе «ОБНОВЛЕНИЕ» –