72 lines
2.3 KiB
C#
72 lines
2.3 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Text;
|
|||
|
|
|||
|
namespace Unity.Burst
|
|||
|
{
|
|||
|
#if BURST_COMPILER_SHARED
|
|||
|
public static class SafeStringArrayHelper
|
|||
|
#else
|
|||
|
internal static class SafeStringArrayHelper
|
|||
|
#endif
|
|||
|
{
|
|||
|
// Methods to help when needing to serialise arrays of strings safely
|
|||
|
public static string SerialiseStringArraySafe(string[] array)
|
|||
|
{
|
|||
|
var s = new StringBuilder();
|
|||
|
foreach (var entry in array)
|
|||
|
{
|
|||
|
s.Append($"{Encoding.UTF8.GetByteCount(entry)}]");
|
|||
|
s.Append(entry);
|
|||
|
}
|
|||
|
return s.ToString();
|
|||
|
}
|
|||
|
|
|||
|
public static string[] DeserialiseStringArraySafe(string input)
|
|||
|
{
|
|||
|
// Safer method of serialisation (len]path) e.g. "5]frank8]c:\\billy" ( new [] {"frank","c:\\billy"} )
|
|||
|
|
|||
|
// Since the len part of `len]path` is specified in bytes we'll be working on a byte array instead
|
|||
|
// of a string, because functions like Substring expects char offsets and number of chars.
|
|||
|
var bytes = Encoding.UTF8.GetBytes(input);
|
|||
|
var listFolders = new List<string>();
|
|||
|
var index = 0;
|
|||
|
var length = bytes.Length;
|
|||
|
while (index < length)
|
|||
|
{
|
|||
|
int len = 0;
|
|||
|
// Read the decimal encoded length, terminated by an ']'
|
|||
|
while (true)
|
|||
|
{
|
|||
|
if (index >= length)
|
|||
|
{
|
|||
|
throw new FormatException($"Invalid input `{input}`: reached end while reading length");
|
|||
|
}
|
|||
|
|
|||
|
var d = bytes[index];
|
|||
|
|
|||
|
if (d == ']')
|
|||
|
{
|
|||
|
index++;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
if (d < '0' || d > '9')
|
|||
|
{
|
|||
|
throw new FormatException(
|
|||
|
$"Invalid input `{input}` at {index}: Got non-digit character while reading length");
|
|||
|
}
|
|||
|
|
|||
|
len = len * 10 + (d - '0');
|
|||
|
|
|||
|
index++;
|
|||
|
}
|
|||
|
|
|||
|
listFolders.Add(Encoding.UTF8.GetString(bytes, index, len));
|
|||
|
index += len;
|
|||
|
}
|
|||
|
|
|||
|
return listFolders.ToArray();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|