2017-07-11 25 views
1

Ich habe zwei Byte-Array von (in C# und Java) eine Zeichenfolge. Wenn ich Arrays konvertiere, stimmen die Ergebnisse nicht überein. Was könnte der Grund dafür sein? Dieses Problem ist nicht konstant. Manchmal erzeugt es die gleichen Ergebnisse.Java UTF-8 String passt nicht C# UTF-8 String

C#: 
[0] 148 
[1] 70 
[2] 38 
[3] 173 
[4] 249 
[5] 227 
[6] 183 
[7] 106 
[8] 57 
[9] 25 
[10] 181  
[11] 13 
[12] 192  
[13] 176  
[14] 128  
[15] 164  

    Java : 


    0 = -108 
    1 = 70 
    2 = 38 
    3 = -83 
    4 = -7 
    5 = -29 
    6 = -73 
    7 = 106 
    8 = 57 
    9 = 25 
    10 = -75 
    11 = 13 
    12 = -64 
    13 = -80 
    14 = -128 
    15 = -92 

C# Ergebnis: F & j9 \ r

Java Ergebnis: F & J90

Edit:

Konvertercode;

C# - 
String result = UTF8Encoding.UTF8.GetString(byteArray); 

Java: 
String result = new String(byteArray, "UTF-8"); 

* Edit-2: Seine wahre konvertieren.

C# : 
     [0] 239 
     [1] 195 
     [2] 40 
     [3] 19 
     [4] 185 
     [5] 36 
     [6] 77 
     [7] 132 
     [8] 182 
     [9] 122 
     [11] 173 
     [12] 12 
     [13] 191 
     [14] 100 
     [15] 118 
Java : 

0 = -17 
1 = -61 
2 = 40 
3 = 19 
4 = -71 
5 = 36 
6 = 77 
7 = -124 
8 = -74 
9 = 122 
10 = -70 
11 = -83 
12 = 12 
13 = -65 
14 = 100 
15 = 118 

C# Ergebnis: ($ Mzdv Java Ergebnis: (Mzdv *

+0

Vielleicht könnte ein Code helfen ...? –

+2

Das sind die gleichen Werte, es scheint nur, dass Sie sie in einem anderen Format anzeigen. Sie sind in C# (Bereich 0/255) vorzeichenlos und in Java (Bereich -128/+127) signiert. –

+0

Bitte geben Sie eine [mcve] an, die die UTF-16-Code-Einheiten der resultierenden Strings anzeigt. Geben Sie auch an, woher die Bytes stammen. Wenn es sich nicht um UTF-8-codierten Text handelte, sollten Sie nicht versuchen, sie als UTF-8 zu dekodieren. –

Antwort

3
$

Ich gehe davon aus dem Ausgänge Sie oben sind die Byte-Arrays entsprechen, mit dem String in C# und Java.

byte in Java is a signed type (between -128 and 127), die die negativen Werte für einige der Bytes erklärt angezeigt.

Es sieht aus wie alle Werte, die für Java-Spiel positiv sind die entsprechenden C# -Werte und nur die n egative Werte in Java stimmen nicht mit den entsprechenden C# -Werten überein. Der Grund dafür ist, dass C# bytes are unsigned (between 0 and 255).

Wenn Sie die Werte ohne Vorzeichen entsprechend mit dem Java Byte drucken, sollten Sie die gleiche Ausgabe wie in C# erhalten:

for (byte b : byteArray) 
    System.out.println(b & 0xff); 
+0

OK, aber für einige Arrays (Java: signed, C#: unsigned) kann es in beiden die gleichen Ergebnisse liefern. –

+0

@fatihbolat Natürlich, wenn alle Bytes zufällig zwischen 0 und 127 liegen, würden sowohl Java als auch C# die gleiche Ausgabe erzeugen. – Eran

+0

https://Stackoverflow.com/a/45027202/8287517 @eran. @H B ist richtig. Also erwarte ich die gleichen Saiten zu produzieren. Dies ist jedoch in einigen Fällen nicht der Fall. –

1

Binary Wert für -108 und 148 beide gleich sind.

In Java, wenn Sie String in Byte-Array konvertieren, dann wird der Wert von char grater dann 127 in negativen Wert konvertiert.

Blick auf Wert von 148 der Windows-Rechner:

enter image description here

Und derselbe Wert für -108:

enter image description here

nun die Bits nach dem ersten 8-Bit verwerfen und das ist 1001 0100 was in beiden gleich ist. Hinweis: Sie müssen verwerfen, da die Länge des Bytes 8 Bit beträgt.