Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 56个字节和99个问题来保存日期和数字_C#_Arrays_Byte_Real Time_Netduino - Fatal编程技术网

C# 56个字节和99个问题来保存日期和数字

C# 56个字节和99个问题来保存日期和数字,c#,arrays,byte,real-time,netduino,C#,Arrays,Byte,Real Time,Netduino,我在一些eeprom上有一个56字节的寄存器,我想用它来存储发动机小时数。目前我只使用3个字节来增加一个60秒的计时器,然后下载信息(在传输之前,这个数字很少超过9999分钟) 问题是我需要将日期与此关联。每次启动车辆时,我都需要开始记录小时数,但我需要确定该小时的递增时间 因此,如果我有一个字节[56]数组,那么最简单的方法是什么来存储日期(或日期的一个小时),后跟一个数字,并能够区分它们 对于传输,我需要一种迭代数组并提取日期或小时数以及小时数的方法 有什么好主意就好了,非常感谢 报告的最终

我在一些eeprom上有一个56字节的寄存器,我想用它来存储发动机小时数。目前我只使用3个字节来增加一个60秒的计时器,然后下载信息(在传输之前,这个数字很少超过9999分钟)

问题是我需要将日期与此关联。每次启动车辆时,我都需要开始记录小时数,但我需要确定该小时的递增时间

因此,如果我有一个字节[56]数组,那么最简单的方法是什么来存储日期(或日期的一个小时),后跟一个数字,并能够区分它们

对于传输,我需要一种迭代数组并提取日期或小时数以及小时数的方法

有什么好主意就好了,非常感谢

报告的最终结果类似于:

06:00-38分钟 09:00-60分钟 10:00-60分钟
etc

好的,这里有一个方案,可以将您需要的所有数据放入56字节中(事实上,我们最多可以将11个日期和时间放入56字节中):

假设你不希望这个系统持续一千年以上,我们可以将一年的前半部分定义为2013年分为两部分,即纪元和年份

  • 历元:允许0-31的5位(或一个字节)
  • 年份:7位(或一个字节),允许0-99
  • 日期:9位(两个字节),允许0-365
  • 小时:允许0-24的5位(一个字节)
  • 秒:12位(两个字节),允许0-3600
现在,您可以简单地使用7个字节并增加每个字节的值,并允许您最多存储8个日期和时间,但您可以创建一个结构并对各个位进行位压缩,从而进一步将其压缩为40位(或5个字节),总共存储11个日期

如果你真的在死记硬背,你也可以放弃历元,但上面的方案将允许你处理3199年之前的日期

我相信还有其他更简洁的方法,例如从1970年1月1日到未来几年的毫秒数可能会减少几位,但会缩短代码的寿命,但我没有查看实际值

一些示例代码(已更新为使用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);
            }
        }
    }
}
使用系统;
使用系统集合;
命名空间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个日期

你可以