60 lines
2.0 KiB
C#
60 lines
2.0 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
|
|||
|
namespace IrcTokens
|
|||
|
{
|
|||
|
public static class Extensions
|
|||
|
{
|
|||
|
public static IEnumerable<byte[]> Split(this byte[] bytes, byte separator)
|
|||
|
{
|
|||
|
if (bytes == null || bytes.Length == 0) return new List<byte[]>();
|
|||
|
|
|||
|
var newLineIndices = bytes.Select((b, i) => b == separator ? i : -1).Where(i => i != -1).ToArray();
|
|||
|
var lines = new byte[newLineIndices.Length + 1][];
|
|||
|
var currentIndex = 0;
|
|||
|
var arrIndex = 0;
|
|||
|
|
|||
|
for (var i = 0; i < newLineIndices.Length && currentIndex < bytes.Length; ++i)
|
|||
|
{
|
|||
|
var n = new byte[newLineIndices[i] - currentIndex];
|
|||
|
Array.Copy(bytes, currentIndex, n, 0, newLineIndices[i] - currentIndex);
|
|||
|
currentIndex = newLineIndices[i] + 1;
|
|||
|
lines[arrIndex++] = n;
|
|||
|
}
|
|||
|
|
|||
|
// Handle the last string at the end of the array if there is one.
|
|||
|
if (currentIndex < bytes.Length)
|
|||
|
lines[arrIndex] = bytes.Skip(currentIndex).ToArray();
|
|||
|
else if (arrIndex == newLineIndices.Length)
|
|||
|
// We had a separator character at the end of a string. Rather than just allowing
|
|||
|
// a null character, we'll replace the last element in the array with an empty string.
|
|||
|
lines[arrIndex] = Array.Empty<byte>();
|
|||
|
|
|||
|
return lines.ToArray();
|
|||
|
}
|
|||
|
|
|||
|
public static byte[] Trim(this IEnumerable<byte> bytes, byte separator)
|
|||
|
{
|
|||
|
if (bytes == null || !bytes.Any()) return Array.Empty<byte>();
|
|||
|
var byteList = new List<byte>(bytes);
|
|||
|
var i = 0;
|
|||
|
|
|||
|
while (byteList[i] == separator)
|
|||
|
{
|
|||
|
byteList.RemoveAt(i);
|
|||
|
i++;
|
|||
|
}
|
|||
|
|
|||
|
i = byteList.Count - 1;
|
|||
|
while (byteList[i] == separator)
|
|||
|
{
|
|||
|
byteList.RemoveAt(i);
|
|||
|
i--;
|
|||
|
}
|
|||
|
|
|||
|
return byteList.ToArray();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|