2009-05-21 4 views
3

funktionieren habe ich ein Byte-Array wie folgt initialisiert:byte [] zu String in Byte-Array-Konvertierung nicht in Java

public static byte[] tmpIV = {0x43, (byte)0x6d, 0x22, (byte)0x9a, 0x22, 
         (byte)0xf8, (byte)0xcf, (byte)0xfe, 0x15, 0x21, 
         (byte)0x0b, 0x38, 0x01, (byte)0xa7, (byte)0xfc, 0x0e}; 

Wenn ich es drucken Sie es mich gibt

67 109 34  -102  34  -8   -49  -2  21  33 
11 56 1  -89  -4  14 

ich dann Das ganze Byte-Array wurde in eine Zeichenfolge konvertiert und an meinen Freund gesendet.

String str = new String(tmpIV); 

Mein Freund ist ein C# -Programmierer

einige andere Daten So bekommt mein Freund. Wie mein Freund erhält die gleichen Daten wie ich gesendet habe. In Java Auch wenn ich die oben Zeichenfolge in Byte-Array zurückzuverwandeln Ich bin nicht die genauen erhalten, die ich gesendet habe:

67  109  34  -17  -65  -67  34  -17  -65  -67 
-17  -65  -67  -17   -65 -67  21  33 11  56  1 
-17  -65  -67   -17  -65  -67 

Antwort

12

Das Problem ist, dass Sie den Byte-Array in einen String in der Plattform Standard konvertiert haben Codierung.

Wenn dies beliebige binäre Daten (die es scheint) dann sollten Sie keine normalen Zeichencodierung verwenden, um es in eine Zeichenfolge zu konvertieren - verwenden Sie stattdessen Base64.

Mit Base64 von Java ist nicht besonders leicht (weil es nicht in den Standardbibliotheken AFAIK), aber es gibt verschiedene 3rd-Party-Bibliotheken, die Sie können, wie the one in the Apache Commons Codec library verwenden.

Auf der # Seite C wird es viel einfacher sein - benutzen Sie einfach:

byte[] data = Convert.FromBase64String(text); 
-4

Ich stimme mit früheren Antwort - Sie sollten base64 Ansatz verwenden, aber base64 verwendet, ist einfach;). Verwenden Sie einfach base64 util Klassen von sun.misc Paket:

import sun.misc.BASE64Decoder; 
import sun.misc.BASE64Encoder; 
import java.io.IOException; 
import java.util.Arrays; 
public class Base64Test { 

    public static byte[] tmpIV = {0x43, (byte) 0x6d, 0x22, (byte) 0x9a, 0x22, 
      (byte) 0xf8, (byte) 0xcf, (byte) 0xfe, 0x15, 0x21, 
      (byte) 0x0b, 0x38, 0x01, (byte) 0xa7, (byte) 0xfc, 0x0e}; 


    public static void main(String[] args) { 
     try { 
      String encoded = new BASE64Encoder().encode(tmpIV); 
      System.out.println(encoded); 
      byte[] decoded = new BASE64Decoder().decodeBuffer(encoded); 
      System.out.println(Arrays.equals(tmpIV,decoded)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+4

Verwenden Sie keine Klassen von Nicht-Standard-APIs !! –

+3

In der Tat. Siehe http://java.sun.com/products/jdk/faq/faq-sun-packages.html –

0

Sie haben sicher machen Sie und Ihr Freund gleiche Codierung Protokoll verwenden. Daher ist in Bezug auf Java, statt String aString = new String(byteArray) es besser ist, String aString = new String(byteArray, Charset.forName("UTF-8")) (zum Beispiel, wenn Sie beide „UTF-8“ bevorzugen) zu verwenden

PS: übrigens, wahrscheinlich gefunden, dass der Byte-Array von ihrem Freund hat folgendes Muster "-17 -65 -67" mehrmals. Meiner Erfahrung nach bedeuten diese drei Zahlenmuster "?" Zeichen in UTF-8