涉及一些数学/十六进制的谜语

时间:2016-03-31 11:49:00

标签: c#

我有如下所示的字符串,我正在使用linqsql从数据库中读取。该字符串表示任务可以在相应的应用程序中运行的时间。我正在记录应用程序的设置,因此希望以人类可读的格式(文本)格式化字符串。我需要一种方法来切断字符串并记录允许运行的时间。我希望这更有意义。

3c8080080040040020020010010000000000000000003c

到目前为止,我已经找到了以下内容。

第一个和最后两个字符表示我们正在使用每小时增量(Hex 3c等于Dec 60)(我们有另一种选择,使用15分钟的间隔,但我现在不会进入)

剩下的字符串实际上每天由AM / PM组成3个字符。我将剥离3c并将日期和上午/下午分开。

[808/008] [004/004] [002/002] [001/001] [000/000] [000/000] [000/000]

从00:00开始每增加1小时>当天11:00已分配十六进制值

800 = 00:00 > 01:00
400 = 01:00 > 02:00
200 = 02:00 > 03:00
100 = 03:00 > 04:00
80 = 04:00 > 05:00
40 = 05:00 > 06:00
20 = 06:00 > 07:00
10 = 07:00 > 08:00
8 = 08:00 > 09:00
4 = 09:00 > 10:00
2 = 10:00 > 11:00
1 = 11:00 > 12:00

因此,例如,如果我们看到星期日的值[808/008],则表明时间表从00:00开始> 01:00(值800)以及08:00> 09:00(价值8)。

现在我的问题是,如何将这个字符串从3c8080080040040020020010010000000000000000003c转换为文本/ xml格式可理解的内容?

我附上了应用程序中显示的时间表图片

enter image description here

2 个答案:

答案 0 :(得分:0)

您可以将字符串转换为2d bool数组,如下所示:

 static void Main(string[] args)
    {
        string input = "3c8080080040040020020010010000000000000000003c";
        bool[][] weekSchedule = ParseSchedule(input);
    }

    static bool[] DayScheduleFromBits(int bits) => Enumerable.Range(0, 12).Select(h => ((1 << (11 - h)) & bits) != 0).ToArray();

    static bool[][] ParseSchedule(string input)
    {
        input = input.Substring(2, input.Length - 4);
        var chunks = Enumerable.Range(0, input.Length / 3).Select(i => input.Substring(i * 3, 3));
        return chunks.Select(chunk => DayScheduleFromBits(Convert.ToInt32(chunk, 16))).ToArray();
    }

数组包含以下格式的数据:

weekSchedule [X] [Y]

每日x索引,每天有两个条目,一个是am,一个是pm。星期日上午时间表是x = 0,下午时间表是x = 1。星期一继续,x = 2,x = 3。

小时指数。 0 <= y&lt; 0 12

您现在可以进一步处理数据,并最终以可读格式打印出来。

此方法使用的事实是,您的小时值是不同位置的单个位(仔细检查DayScheduleFromBits)。

答案 1 :(得分:-1)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string decode = "8421";
            string input = "3c8080080040040020020010010000000000000000003c";

            DateTime sunday = DateTime.Parse("4/3/2016");

            for (int dayIndex = 0; dayIndex < 7; dayIndex++)
            {
                for (int fourHourIndex = 0; fourHourIndex < 6; fourHourIndex++)
                {
                    if (input.Substring((6 * dayIndex) + fourHourIndex + 2, 1) != "0")
                    {
                        DateTime tempDate = sunday.AddDays(dayIndex).AddHours((4 * fourHourIndex) + decode.IndexOf(input.Substring((6 * dayIndex) + fourHourIndex + 2, 1)));
                        Console.WriteLine(tempDate.ToString());
                    }
                }
            }
            Console.ReadLine();
        }
    }
}