class DistinguishedNameSplit
{
static string[] hexCodes = new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "A", "b", "B", "c", "C", "d", "D", "e", "E", "f", "F" };
public static List<string> Split(string distinguishedName)
{
List<string> pool = new List<string>();
StringBuilder working = new StringBuilder();
string hexHigh = "";
MachineStatus status = MachineStatus.A;
int index = 0;
int indexMax = distinguishedName.Length - 1;
while (index <= indexMax)
{
string value = distinguishedName.Substring(index, 1);
switch (status)
{
case MachineStatus.A:
if (value == ",")
{
pool.Add(working.ToString());
working.Clear();
}
else if (value == "\"")
{
working.Append("\"");
status = MachineStatus.B;
}
else if (value == "\\")
{
status = MachineStatus.C;
}
else
{
working.Append(value);
}
break;
case MachineStatus.B:
if (value == "\"")
{
working.Append("\"");
status = MachineStatus.A;
}
else if (value == "\\")
{
status = MachineStatus.E;
}
else
{
working.Append(value);
}
break;
case MachineStatus.C:
if (value == "," || value == "\"" || value == "\\")
{
working.Append(value);
status = MachineStatus.A;
}
else if (hexCodes.Contains(value))
{
hexHigh = value;
status = MachineStatus.D;
}
else
{
throw new ArgumentException("The distinguished name specified is not typed legally.");
}
break;
case MachineStatus.D:
if (hexCodes.Contains(value))
{
working.Append((char)Convert.ToByte(String.Format("{0}{1}", hexHigh, value), 16));
status = MachineStatus.A;
}
else
{
throw new ArgumentException("The distinguished name specified is not typed legally.");
}
break;
case MachineStatus.E:
if (value == "," || value == "\"" || value == "\\")
{
working.Append(value);
status = MachineStatus.B;
}
else if (hexCodes.Contains(value))
{
hexHigh = value;
status = MachineStatus.F;
}
else
{
throw new ArgumentException("The distinguished name specified is not typed legally.");
}
break;
case MachineStatus.F:
if (hexCodes.Contains(value))
{
working.Append((char)Convert.ToByte(String.Format("{0}{1}", hexHigh, value), 16));
status = MachineStatus.B;
}
else
{
throw new ArgumentException("The distinguished name specified is not typed legally.");
}
break;
}
index++;
}
if (status == MachineStatus.A)
{
pool.Add(working.ToString());
return pool;
}
else
{
throw new ArgumentException("The distinguished name specified is not ended correctly.");
}
}
enum MachineStatus
{
A, B, C, D, E, F
}
}
Related