C# 56个字节和99个问题来保存日期和数字
我在一些eeprom上有一个56字节的寄存器,我想用它来存储发动机小时数。目前我只使用3个字节来增加一个60秒的计时器,然后下载信息(在传输之前,这个数字很少超过9999分钟) 问题是我需要将日期与此关联。每次启动车辆时,我都需要开始记录小时数,但我需要确定该小时的递增时间 因此,如果我有一个字节[56]数组,那么最简单的方法是什么来存储日期(或日期的一个小时),后跟一个数字,并能够区分它们 对于传输,我需要一种迭代数组并提取日期或小时数以及小时数的方法 有什么好主意就好了,非常感谢 报告的最终结果类似于: 06:00-38分钟 09:00-60分钟 10:00-60分钟C# 56个字节和99个问题来保存日期和数字,c#,arrays,byte,real-time,netduino,C#,Arrays,Byte,Real Time,Netduino,我在一些eeprom上有一个56字节的寄存器,我想用它来存储发动机小时数。目前我只使用3个字节来增加一个60秒的计时器,然后下载信息(在传输之前,这个数字很少超过9999分钟) 问题是我需要将日期与此关联。每次启动车辆时,我都需要开始记录小时数,但我需要确定该小时的递增时间 因此,如果我有一个字节[56]数组,那么最简单的方法是什么来存储日期(或日期的一个小时),后跟一个数字,并能够区分它们 对于传输,我需要一种迭代数组并提取日期或小时数以及小时数的方法 有什么好主意就好了,非常感谢 报告的最终
etc好的,这里有一个方案,可以将您需要的所有数据放入56字节中(事实上,我们最多可以将11个日期和时间放入56字节中): 假设你不希望这个系统持续一千年以上,我们可以将一年的前半部分定义为2013年分为两部分,即纪元和年份
- 历元:允许0-31的5位(或一个字节)
- 年份:7位(或一个字节),允许0-99
- 日期:9位(两个字节),允许0-365
- 小时:允许0-24的5位(一个字节)
- 秒:12位(两个字节),允许0-3600
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);
}
}
}
}
使用系统;
使用系统集合;
命名空间BitBangingDate
{
班级计划
{
静态void Main(字符串[]参数)
{
CompactDateManipulator x=新的CompactDateManipulator();
Console.WriteLine(x.ToString());
x、 月=7;
x、 日=27;
x、 分钟=1234;
Console.WriteLine(x.ToString());
var bitArr=x.GetCompactedArray();
CompactDateManipulator x1=new CompactDateManipulator();//创建新的空白日期以测试是否可以从BitArray重新初始化
x1.重新初始化EDATEFROMBITARY(bitArr);
Console.WriteLine(x1.ToString());
}
}
类CompactDateManipulator
{
CompactDate _date=新的CompactDate();
公共整数月
{
得到
{
返回BoolArrayToInt(_date.month);
}
设置
{
IntToBoolArray(参考日期、月份、值);
}
}
公众国际日
{
得到
{
返回BoolArrayToInt(_date.day);
}
设置
{
IntToBoolArray(参考日期、值);
}
}
公共整数分钟
{
得到
{
返回BoolArrayToInt(_date.minute);
}
设置
{
IntToBoolArray(参考日期分钟值);
}
}
公共位数组GetCompactedArray()
{
返回_date.GetFullArray();
}
public void重新初始化位元数组(位元数组arr)
{
_日期。设置日期(arr);
}
//实用方法
无效IntToBoolArray(参考布尔[]位,整数输入)
{
var len=位长度;
对于(int i=0;i>=1;
}
}
int BoolArrayToInt(bool[]位)
{
如果(bits.Length>32)抛出新的ArgumentException(“一个int只能容纳32位”);
int r=0;
for(int i=0;i 如果(位[i])r |=1好的,这里有一个方案,可以将您需要的所有数据放入56字节(事实上,我们最多可以将11个日期和时间放入56字节):
假设你不希望这个系统持续一千年以上,我们可以将一年的前半部分定义为2013年分为两部分,即纪元和年份
- 历元:允许0-31的5位(或一个字节)
- 年份:7位(或一个字节),允许0-99
- 日期:9位(两个字节),允许0-365
- 小时:允许0-24的5位(一个字节)
- 秒:12位(两个字节),允许0-3600
现在,您可以简单地使用7个字节并增加每个字节的值,并允许您最多存储8个日期和时间,但您可以创建一个结构并对各个位进行位压缩,从而进一步将其压缩为40位(或5个字节),总共存储11个日期
你可以