34 lines
1.0 KiB
C#
34 lines
1.0 KiB
C#
|
using System.Collections.Generic;
|
|||
|
|
|||
|
namespace EonaCat.DnsTester.Helpers
|
|||
|
{
|
|||
|
public class DnsNameParser
|
|||
|
{
|
|||
|
public static string ParseName(byte[] responseBytes, ref int offset)
|
|||
|
{
|
|||
|
List<string> labels = new List<string>();
|
|||
|
int length;
|
|||
|
|
|||
|
while ((length = responseBytes[offset++]) != 0)
|
|||
|
{
|
|||
|
if ((length & 0xC0) == 0xC0)
|
|||
|
{
|
|||
|
// The name is compressed
|
|||
|
int pointer = ((length & 0x3F) << 8) | responseBytes[offset++];
|
|||
|
int savedOffset = offset;
|
|||
|
offset = pointer;
|
|||
|
labels.AddRange(ParseName(responseBytes, ref offset).Split('.'));
|
|||
|
offset = savedOffset;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
// The name is not compressed
|
|||
|
labels.Add(System.Text.Encoding.ASCII.GetString(responseBytes, offset, length));
|
|||
|
offset += length;
|
|||
|
}
|
|||
|
|
|||
|
return string.Join(".", labels);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|