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