2011-01-06 21 views
5

que tienen una matriz de bytes que desea asignar como sigue:La asignación a una matriz de bytes en Java

  • primer byte especifica la longitud de la cadena: (byte)string.length()
  • segundo - últimos bytes contienen datos de cadena de string.getBytes()

Además de utilizar un bucle for, ¿hay una manera rápida de inicializar una matriz de bytes utilizando bytes de dos variables diferentes?

+2

Pueden garantizar que sus cuerdas será siempre <256 caracteres de longitud (128 si no lidiar con el bit de signo)? – Anon

+0

Sí, puedo, y ¿pueden dar más detalles sobre cómo lidiar con el bit de signo? – fredley

+0

@Anon: 'byte' es un tipo sin signo en Java. – Powerlord

Respuesta

6

Puede utilizar System.arrayCopy() para copiar los bytes:

String x = "xx"; 
byte[] out = new byte[x.getBytes().length()+1]; 
out[0] = (byte) (0xFF & x.getBytes().length()); 
System.arraycopy(x.getBytes(), 0, out, 1, x.length()); 

Aunque el uso de algo así como un ByteArrayOutputStream o una ByteBuffer al igual que otras personas que se sugiere es, probablemente, un enfoque más limpio y será mejor para usted en el largo plazo :-)

+2

Esto es probablemente más simple que usar una clase de biblioteca para una operación así de directa. Un comentario es que la operación '(0xFF & ...)' es completamente redundante cuando se pasa a un byte. El molde '(byte)' se trunca de la misma manera. Solo cuando vuelves a un número entero, te importa. –

+0

Ok, concedido. Estaba pensando, mejor salvo, perdón, ¿no? ;-) – Guss

2

¿Qué tal ByteBuffer?

Ejemplo:

ByteBuffer bb = ByteBuffer.allocate(string.getBytes().length +1); 
    bb.put((byte) string.length()); 
    bb.put(string.getBytes()); 
+2

Este es el enfoque correcto, pero requiere algunos comentarios. Primero, necesita verificar la longitud de la cuerda antes de lanzar a ciegas a 'byte'. En segundo lugar, debe usar la variante de 'String.getBytes()' que toma un juego de caracteres. – Anon

+0

@Anon de acuerdo con sus comentarios +1 :) @fredley si está siguiendo, por favor, ocúpese de esto –

+2

Sería bueno incluir el código para llegar a lo que el OP solicitó: una matriz de bytes. –

2

Whil e ByteBuffer es generalmente la mejor manera de construir matrices de bytes, teniendo en cuenta los objetivos de la OP Creo que el siguiente será más robusto:

public static void main(String[] argv) 
throws Exception 
{ 
    String s = "any string up to 64k long"; 

    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    DataOutputStream out = new DataOutputStream(bos); 
    out.writeUTF(s); 
    out.close(); 

    byte[] bytes = bos.toByteArray(); 

    ByteArrayInputStream bis = new ByteArrayInputStream(bytes); 
    DataInputStream in = new DataInputStream(bis); 

    String s2 = in.readUTF(); 
} 
Cuestiones relacionadas