我有如下所示的字符串,我正在使用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格式可理解的内容?
我附上了应用程序中显示的时间表图片
答案 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();
}
}
}