Files
DevToolsAvalonia/常用工具集/Utility/Network/Modbus/SharpSerial/Program.Tools.cs
2025-08-26 08:37:44 +08:00

100 lines
3.1 KiB
C#

using System;
using System.Text;
namespace SharpSerial
{
public static class Tools
{
public static void SetupGlobalCatcher()
{
AppDomain.CurrentDomain.UnhandledException += ExceptionHandler;
}
public static void ExceptionHandler(object sender, UnhandledExceptionEventArgs args)
{
ExceptionHandler(args.ExceptionObject as Exception);
}
public static void ExceptionHandler(Exception ex)
{
Try(() => Stdio.Trace("!{0}", ex.ToString()));
Try(() => Stdio.WriteLine("!{0}", ex.ToString()));
Environment.Exit(1);
}
public static string StringHex(byte[] data)
{
var sb = new StringBuilder();
sb.Append("<");
foreach (var b in data) sb.Append(b.ToString("X2"));
return sb.ToString();
}
public static byte[] ParseHex(string text)
{
Assert(text.Length % 2 == 1, "Odd length expected for {0}:{1}", text.Length, text);
var bytes = new byte[text.Length / 2];
for (var i = 0; i < bytes.Length; i++)
{
var b2 = text.Substring(1 + i * 2, 2);
bytes[i] = Convert.ToByte(b2, 16);
}
return bytes;
}
public static void SetProperty(object target, string line)
{
var parts = line.Split(new char[] { '=' });
if (parts.Length != 2) throw Make("Expected 2 parts in {0}", Readable(line));
var propertyName = parts[0];
var propertyValue = parts[1];
var property = target.GetType().GetProperty(propertyName);
if (property == null) throw Make("Property not found {0}", Readable(propertyName));
var value = FromString(property.PropertyType, propertyValue);
property.SetValue(target, value, null);
}
public static object FromString(Type type, string text)
{
if (type.IsEnum) return Enum.Parse(type, text);
return Convert.ChangeType(text, type);
}
public static void Try(Action action)
{
try
{
action.Invoke();
}
catch (Exception)
{
//no clear use case for cleanup exception
}
}
public static Exception Make(string format, params object[] args)
{
var line = format;
if (args.Length > 0) line = string.Format(format, args);
return new Exception(line);
}
public static string Readable(string text)
{
var sb = new StringBuilder();
foreach (var c in text)
{
if (Char.IsControl(c)) sb.Append(((int)c).ToString("X2"));
else if (Char.IsWhiteSpace(c)) sb.Append(((int)c).ToString("X2"));
else sb.Append(c);
}
return sb.ToString();
}
public static void Assert(bool condition, string format, params object[] args)
{
if (!condition) throw Make(format, args);
}
}
}