Cómo localizar una secuencia de valores (en concreto, bytes) dentro de una colección más grande en .NET

StackOverflow https://stackoverflow.com/questions/2345304

  •  23-09-2019
  •  | 
  •  

Pregunta

necesito para analizar los bytes de un archivo para que sólo tomo los datos después de una cierta secuencia de bytes se ha identificado. Por ejemplo, si la secuencia es simplemente 0xFF (un byte), entonces puedo utilizar LINQ en la colección:

byte[] allBytes = new byte[] {0x00, 0xFF, 0x01};
var importantBytes = allBytes.SkipWhile(byte b => b != 0xFF);
// importantBytes = {0xFF, 0x01}

Pero, ¿existe una manera elegante para detectar una secuencia de varios bytes - por ejemplo, 0xFF, 0xFF - especialmente uno que preclasificación en caso de que empieza a ser un partido falso positivo

¿Fue útil?

Solución

No estoy al tanto de cualquier manera integrada; como de costumbre, siempre se puede escribir su propio método de extensión. Aquí uno de la parte superior de la cabeza (puede haber formas más eficientes para ponerla en práctica):

public static IEnumerable<T> AfterSequence<T>(this IEnumerable<T> source,
    T[] sequence)
{
    bool sequenceFound = false;
    Queue<T> currentSequence = new Queue<T>(sequence.Length);
    foreach (T item in source)
    {
        if (sequenceFound)
        {
            yield return item;
        }
        else
        {
            currentSequence.Enqueue(item);

            if (currentSequence.Count < sequence.Length)
                continue;

            if (currentSequence.Count > sequence.Length)
                currentSequence.Dequeue();

            if (currentSequence.SequenceEqual(sequence))
                sequenceFound = true;
        }
    }
}

Voy a tener que comprobar para asegurarse de que esto es correcto, pero debe darle la idea básica; iterar a través de los elementos, un seguimiento de la última secuencia de valores recuperados, establecer un indicador cuando se encuentra la secuencia, y una vez que se establece el indicador, inicie volviendo cada elemento posterior.

Editar - Me hizo correr una prueba, y funciona correctamente. Aquí hay algo de código de prueba:

static void Main(string[] args)
{
    byte[] data = new byte[]
    {
        0x01, 0x02, 0x03, 0x04, 0x05,
        0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA
    };
    byte[] sequence = new byte[] { 0x02, 0x03, 0x04, 0x05 };
    foreach (byte b in data.AfterSequence(sequence))
    {
        Console.WriteLine(b);
    }
    Console.ReadLine();
}

Otros consejos

Si convierte sus bytes en una cadena, se puede tomar ventaja de la gran cantidad de funciones de búsqueda incorporadas en que, incluso si los bytes se trabaja con caracteres no son en realidad en el sentido tradicional.

Al igual que un poco de la teoría; este es un problema de lenguaje regular. Es posible que pueda utilizar un motor de expresiones regulares para detectarlo. El primer golpe para Google "expresión regular en funcionamiento" encontró

http://codeguru.earthweb.com/columns/experts/article .php / c14689

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top