Trwa tutaj niedopasowanie impedancji. Chcesz pracować z wyrażeń regularnych w .Net, które używają ciągów (znaki wielobajtowe), ale chcesz pracować ze znakami jednobajtowymi. Nie możesz mieć obu jednocześnie używając .Net jak zwykle.
Jednak, aby przełamać tę niedopasowanie, można zająć się ciągiem w sposób zorientowany na bajt i zmutować go. Zmutowany ciąg może następnie działać jako bufor do ponownego wykorzystania. W ten sposób nie będziesz musiał konwertować bajtów na znaki lub konwertować bufora wejściowego na ciąg znaków (jak na twoje pytanie).
Przykład:
//BLING
byte[] inputBuffer = { 66, 76, 73, 78, 71 };
string stringBuffer = new string('\0', 1000);
Regex regex = new Regex("ING", RegexOptions.Compiled);
unsafe
{
fixed (char* charArray = stringBuffer)
{
byte* buffer = (byte*)(charArray);
//Hard-coded example of string mutation, in practice you would
//loop over your input buffers and regex\match so that the string
//buffer is re-used.
buffer[0] = inputBuffer[0];
buffer[2] = inputBuffer[1];
buffer[4] = inputBuffer[2];
buffer[6] = inputBuffer[3];
buffer[8] = inputBuffer[4];
Console.WriteLine("Mutated string:'{0}'.",
stringBuffer.Substring(0, inputBuffer.Length));
Match match = regex.Match(stringBuffer, 0, inputBuffer.Length);
Console.WriteLine("Position:{0} Length:{1}.", match.Index, match.Length);
}
}
Stosując tę technikę można przeznaczyć ciąg „bufor”, które mogą być ponownie wykorzystane jako wejście do Regex, ale można zmutować go ze swoimi bajtów za każdym razem. Pozwala to uniknąć narzutu konwersji \ kodowania tablicy bajtów na nowy ciąg .Net za każdym razem, gdy chcesz zrobić dopasowanie. Może to okazać się bardzo znaczące, ponieważ widziałem wiele algorytmów w .Net, próbujących pokonać miliony mil na godzinę, by zostać sprowadzonym na kolana przez generowanie ciągów, a następnie rozsyłanie spamu i czas spędzony w GC.
Oczywiście jest to kod niebezpieczny, ale jest .Net.
Wyniki Regex będą generować ciągi znaków, więc masz tu problem. Nie jestem pewien, czy istnieje sposób użycia Regex, który nie generuje nowych ciągów. Z pewnością można uzyskać informacje o indeksie i długości dopasowania, ale generowanie ciągów narusza wymagania dotyczące wydajności pamięci.
Aktualizacja
Właściwie po demontażu Regex \ Mecz \ Grupa \ chwytanie, wygląda na to, że tylko generuje przechwycony ciąg podczas korzystania z właściwości Value, więc może przynajmniej nie generować ciągi Jeśli masz tylko Właściwości indeksu dostępu i długości. Będziesz jednak generował wszystkie wspierające obiekty Regex.
Czy możesz podać przykład wzoru RegEx, który chcesz dopasować? –
@Nate Dudek, nie rozumiem, jak to ma znaczenie. Szukam ogólnej biblioteki regex, ponieważ próbuję analizować złożone protokoły internetowe. Nie jest to konkretne wyrażenie regularne. Jeśli naprawdę potrzebujesz przykładu zobacz http://www.ietf.org/rfc/rfc2616.txt dla różnych wyrażeń regularnych (odnosi się to również do innych programów). – brickner
W rzeczywistości .NET nie obsługuje wejścia binarnego dla Wyrażenia regularnego. Rozumiem, że nie chcesz tracić czasu na przetwarzanie, ale jeśli jedynym bohaterem są znaki specjalne, możesz konwertować bajty na ciągi bez problemu, ponieważ ciąg .NET jest kodowany przy użyciu UTF-16 Unicode. Wszystkie znaki będą obsługiwane. – Ucodia