2011-01-06 6 views
5

Mam tablicę bajtów I chcesz przypisać następująco:Przypisanie do tablicy bajtów w Javie

  • Pierwszy bajt określa długość łańcucha: (byte)string.length()
  • 2-ty - Ostatnio bajty zawierają ciąg danych z string.getBytes()

Innym sposobem niż użycie pętli for jest szybki sposób na zainicjowanie tablicy bajtów za pomocą bajtów z dwóch różnych zmiennych?

+2

można zagwarantować, że struny zawsze będzie <256 znaków (128 jeśli don nie zajmuje się bitem znaku)? – Anon

+0

Tak, mogę i czy możesz rozwinąć kwestię bitu znaku? – fredley

+0

@Anon: 'byte' to typ unsigned w Javie. – Powerlord

Odpowiedz

6

Można użyć System.arrayCopy() kopiowanie bajtów:

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()); 

Choć użyciu coś jak ByteArrayOutputStream lub ByteBuffer jak inni sugerowane jest prawdopodobnie czystsze podejście i na dłuższą metę będzie lepiej dla Ciebie :-)

+2

Jest to prawdopodobnie prostsze niż użycie klasy biblioteki dla operacji, która jest prosta. Jeden komentarz jest taki, że operacja '(0xFF & ...)' jest całkowicie nadmiarowa podczas przechodzenia do bajtu. Odbicie '(byte)' obcina się w ten sam sposób. To tylko wtedy, gdy wracasz do liczby całkowitej, która cię interesuje. –

+0

OK, przyznano. Myślałem, bezpieczniej niż przepraszam, prawda? ;-) – Guss

0

Co powiecie na ?

2

Co powiecie na ByteBuffer?

Przykład:

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

To jest właściwe podejście, ale wymaga pewnych komentarzy. Po pierwsze, musi sprawdzić długość ciągu przed ślepym rzutowaniem na "bajt". Po drugie, powinien użyć wariantu 'String.getBytes()', który przyjmuje zestaw znaków. – Anon

+0

@Anon zgadzam się z twoimi komentarzami +1 :) @fredley jeśli podążasz proszę zaopiekuj się tym –

+2

Byłoby miło dołączyć kod, aby dostać się do tego, o co prosił OP: tablica bajtowa. –

2

Whil e ByteBuffer jest zwykle najlepszym sposobem na budowanie tablic bajtowych, biorąc pod uwagę cele PO za myślę dodaje będą bardziej wytrzymałe:

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(); 
}