Utiliser la représentation hexagonale de ints, il réduit la taille de la chaîne:
sérialisation:
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();
Voici la chaîne de rm: "xy: 1,2: A.14: 64.c8: 3e8.7d0: 2710.4e20:"
Deserialize, fendage ('sérialisé' est la chaîne contient la chaîne de nombres):
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)));
}
Ou vous pourriez vous demander d'analyser des groupes ("[0-9a-fA-F]. [0-9a-fA-F]"), c'est à vous de décider. Je ne suis pas sûr de ce qui est le plus rapide.
ou d'une simple machine d'état (juste pour le plaisir):
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));
}
}
à mon humble avis. EDITED: Ou mieux encore d'empaqueter des entiers à des groupes d'hex: 1212 à 'CC' comme il est utilisé dans les anciens systèmes financiers; cela fait deux fois moins de longueur de corde.
Ces points sont-ils des points 2D avec des valeurs X et Y? Y a-t-il des limites pour ces points? – idursun
@idursun ils sont réellement des coordonnées d'image, donc je suppose que jamais plus de 65536 (deux octets) – honibis
Les images ne sont pas limitées à seulement 16 bits dimensions. Cela peut être vrai pour certains formats d'image, mais les fichiers PNG et TIFF utilisent 32 bits pour définir les dimensions. Une analyse d'une trame de film 4x5 donnera un fichier qui a plus de 120 000 pixels sur la longue dimension. –