Firstborn/Library/PackageCache/com.unity.burst@1.8.4/Runtime/SafeStringArrayHelper.cs

72 lines
2.3 KiB
C#
Raw Normal View History

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();
}
}
}