gpt4 book ai didi

c# - 字符串解析技术

转载 作者:行者123 更新时间:2023-11-30 19:23:58 26 4
gpt4 key购买 nike

我正在尝试找到一种将消息字符串解析为对象的好方法。该字符串是固定长度的,如下所述。

Snippet of string spec

  • 协议(protocol) = int(2)
  • 消息类型 = 字符串(1)
  • 测量=字符串(4)
  • 等等

做一个简单的 String.Split 会起作用,但我认为当您开始接近字符串的末尾时可能会有点麻烦。例如:

var field1 = s.SubString(0,2);
var field2 = s.SubString(2,4);
....
var field99 = s.SubString(88,4); // difficult magic numbers

我考虑过使用正则表达式并认为这可能更令人困惑。

我试图想出一个优雅的解决方案,我可以在其中创建一个解析器,该解析器传递了一个“配置”,其中详细说明了如何解析字符串。

有点像...

 MyConfig config = new MyConfig()
config.Add("Protocol", Length=2, typeof(int));
config.Add("MessageType", Length=1, typeof(char));


Parser p = new Parser(config);
var parserResult = p.Parse(message);

...但我现在正在原地打转,一无所获。任何指针都会有很大的帮助。

最佳答案

一个简单的消息结构:

class Message
{
public DateTime DateTime { get; set; }
public int Protocol { get; set; }
public string Measurement { get; set; }
public string Type { get; set; }
//....
}

结合一个知道如何反序列化它的类:

class MessageSerializer
{
public Message Deserialize(string str)
{
Message message = new Message();
int index = 0;
message.Protocol = DeserializeProperty(str, ref index, 2, Convert.ToInt32);
message.Type = DeserializeProperty(str, ref index, 1, Convert.ToString);
message.Measurement = DeserializeProperty(str, ref index, 4, Convert.ToString);
message.DateTime = DeserializeProperty<DateTime>(str, ref index, 16, (s) =>
{
// Parse date time from 2013120310:28:55 format
return DateTime.ParseExact(s, "yyyyMMddhh:mm:ss", CultureInfo.CurrentCulture);
});
//...
return message;
}

static T DeserializeProperty<T>(string str, ref int index, int count,
Func<string, T> converter)
{
T property = converter(str.Substring(index, count));
index += count;
return property;
}
}

关于c# - 字符串解析技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41850029/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com