c# - 将 List<Point> 存储在字符串中并解析回来的最佳方法

标签 c# .net base64

在生成最小 字符串长度的字符串中,使用最快的解析回算法存储点类型列表的最快方法是什么?

我发现框架有 Convert.ToBase64String、Convert.FromBase64String 方法。对使用这些甚至更好的自行设计算法的任何想法持开放态度;)

提前致谢

C#, vs2005 (.net 2.0)

-编辑-

我将在 activeX 组件中使用代码,我不能为此目的添加另一个库。

最佳答案

使用整数的十六进制表示,它减少了字符串的大小:

序列化:

List<Point> list = new List<Point>(new Point[] {new Point(1, 2), new Point(10, 20), new Point (100, 200), new Point(1000, 2000), new Point(10000, 20000)});

// 1. To.
StringBuilder sb = new StringBuilder();
foreach (Point point in list)
{
    sb.Append(Convert.ToString(point.X, 16));sb.Append('.');
    sb.Append(Convert.ToString(point.Y, 16));sb.Append(':');
}

string serialized = sb.ToString(); 

这里是字符串的形式:“x.y:1.2:a.14:64.c8:3e8.7d0:2710.4e20:”

反序列化、拆分('serialized'是字符串包含数字链):

string[] groups = serialized.Split(new char[] {':'}, StringSplitOptions.RemoveEmptyEntries);
foreach (string group in groups)
{
    string[] coords = group.Split('.');
    restored.Add(new Point(Convert.ToInt32(coords[0], 16), Convert.ToInt32(coords[1], 16)));
}

或者您可以使用正则表达式来解析组(“[0-9a-fA-F].[0-9a-fA-F]”),这取决于您。我不确定哪个更快。

或者一个简单的状态机(只是为了好玩):

List<Point> restored = new List<Point>();
string value = default(string);
int left = 0;
int x = 0, y = 0;
for (int i = 0; i < serialized.Length; i++)
{
    if (serialized[i] == '.')
    {
        value = serialized.Substring(left, i - left);
        left = i + 1;
        x = Convert.ToInt32(value, 16); 
    }
    else if (serialized[i] == ':')
    {
        value = serialized.Substring(left, i - left);
        left = i + 1;
        y = Convert.ToInt32(value, 16);
        restored.Add(new Point(x, y));
    }
}

恕我直言。

已编辑:或者更好地将整数打包为十六进制组:1212 到“CC”,就像在旧金融系统中使用的那样;它使字符串的长度减少两倍。

关于c# - 将 List<Point> 存储在字符串中并解析回来的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4023436/

相关文章:

.net - Caliburn.Micro 设置控件的状态

c# - 从 T4 模板调用同一项目中的类

c# - 检查文件是否存在错误

php - 可能的字符 base64 url​​ 安全功能

encoding - Base64 编码的字符串是否唯一?

c# - Xamarin Forms 和 EntityFramework 属性兼容性

c# - 从 C# API 将 excel 图表中轴的下限和上限设置为数据集的最小值/最大值

javascript - 在 javascript/jquery 中将 base64 转换为图像

C# 在 WebBrowser 控件中选中/取消选中复选框?

c# - 就良好的编程而言,使用键枚举或 Ascii 代码更好?