Saltar al contenido

Cómo dividir un byte array alrededor de una secuencia de bytes en Java?

No dudes en compartir nuestra página y códigos con tus amigos, necesitamos tu ayuda para ampliar nuestra comunidad.

Solución:

Aquí tienes una solución sencilla.

A diferencia del enfoque de avgvstvs, maneja delimitadores de longitud arbitrarios. La respuesta principal también es buena, pero el autor no ha solucionado el problema señalado por Eitan Perkal. Ese problema se evita aquí utilizando el enfoque que sugiere Perkal.

public static List tokens(byte[] array, byte[] delimiter) 
        List byteArrays = new LinkedList<>();
        if (delimiter.length == 0) 
            return byteArrays;
        
        int begin = 0;

        outer:
        for (int i = 0; i < array.length - delimiter.length + 1; i++) 
            for (int j = 0; j < delimiter.length; j++) 
                if (array[i + j] != delimiter[j]) 
                    continue outer;
                
            
            byteArrays.add(Arrays.copyOfRange(array, begin, i));
            begin = i + delimiter.length;
        
        byteArrays.add(Arrays.copyOfRange(array, begin, array.length));
        return byteArrays;
    

Tenga en cuenta que puede convertir de forma fiable desde bytes[] a String y viceversa, con un mapeo uno a uno de caracteres a bytes, si usa la codificación "iso8859-1".

Sin embargo, sigue siendo una fea solución.

Creo que tendrás que enrollar el tuyo.

Sugiero resolverlo en dos etapas:

  1. Descubra cómo encontrar los índices de cada aparición del separador. Google para "Knuth-Morris-Pratt" para un algoritmo eficiente, aunque un algoritmo más ingenuo estará bien para delimitadores cortos.
  2. Cada vez que encuentre un índice, use Arrays.copyOfRange () para obtener la pieza que necesita y agregarla a su lista de salida.

Aquí está utilizando un algoritmo de búsqueda de patrones ingenuo. KMP valdría la pena si los delimitadores son largos (porque evita el retroceso, pero no pierde delimitadores si están incrustados en una secuencia que no coincide al final).

public static boolean isMatch(byte[] pattern, byte[] input, int pos) 
    for(int i=0; i< pattern.length; i++) 
        if(pattern[i] != input[pos+i]) 
            return false;
        
    
    return true;


public static List split(byte[] pattern, byte[] input) 
    List l = new LinkedList();
    int blockStart = 0;
    for(int i=0; i

Modifiqué 'L. La respuesta de Blanc para manejar delimitadores al principio y al final. Además, le cambié el nombre a 'dividir'.

private List split(byte[] array, byte[] delimiter)

   List byteArrays = new LinkedList();
   if (delimiter.length == 0)
   
      return byteArrays;
   
   int begin = 0;

   outer: for (int i = 0; i < array.length - delimiter.length + 1; i++)
   
      for (int j = 0; j < delimiter.length; j++)
      
         if (array[i + j] != delimiter[j])
         
            continue outer;
         
      

      // If delimiter is at the beginning then there will not be any data.
      if (begin != i)
         byteArrays.add(Arrays.copyOfRange(array, begin, i));
      begin = i + delimiter.length;
   

   // delimiter at the very end with no data following?
   if (begin != array.length)
      byteArrays.add(Arrays.copyOfRange(array, begin, array.length));

   return byteArrays;

Aquí tienes las reseñas y calificaciones

Recuerda que tienes la opción de añadir un criterio si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *