2015-05-28 1 views
6

Hier arbeite ich mit einer Java zu C# Beispiel App Übersetzung, die Kryptografie (AES und RSA und so weiter ...)Warum die Notwendigkeit eines bitweisen "und" für einige Char-to-Byte-Konvertierungen in Java?

Irgendwann im Java-Code (der, der tatsächlich funktioniert und in C# übersetzt wird)), habe ich dieses Stück Code gefunden:

for (i = i; i < size; i++) { 
    encodedArr[j] = (byte) (data[i] & 0x00FF); 
    j++; 
} // where data variable is a char[] and encodedArr is a byte[] 

Nach einigen googeln (here), habe ich gesehen, dass dies ein gemeinsames Verhalten auf Java-Code in erster Linie ist ...

ich weiß, dass char ist ein 16-Bit-Typ und byte ist nur 8-Bit, aber ich könnte nicht unterbestimmen nd den Grund für diese bitweise und Operation für eine char->byte Umwandlung.

Könnte jemand erklären?

Vielen Dank im Voraus.

+0

Es ist wahrscheinlich, einen möglichen Überlauf zu umgehen, wenn es einen Wert im oberen Byte des Zeichens gibt. Anderenfalls würde ein Casting nur zu einem Überlauf für ein Byte führen, da es nur 255 (FF) als Maximalwert halten kann. –

Antwort

4

Wenn konvertieren Sie 0x00FF Binär es 0000 0000 1111 1111

wird, wenn Sie und alles mit 1 ist es selbst:

1 && 1 = 1, 0 && 1 = 0

Wenn Sie und alles, was mit 0, es 0 ist

1 && 0 = 0, 0 && 0 = 0

Wenn diese Operation ausgeführt wirdEs nimmt nur die letzten 8 Bits und die letzten 8 Bits der Daten und speichert diese. Es wirft die ersten 8 Bits weg und speichert die letzten 8

Der Grund, warum dies benötigt wird, ist, weil ein Byte als ein Acht-Bit-Wert definiert ist. Das bitweise und existiert, um einen möglichen Überlauf zu stoppen -> IE, das 9 Bits in ein Byte zuweist

Ein Zeichen in Java ist 2 bytes! Diese Logik soll einen Überlauf stoppen. Wie jedoch jemand darauf hingewiesen hat, ist dies sinnlos, weil die Besetzung es für dich tut. Vielleicht war jemand vorsichtig?

+0

möchten Sie nicht das char in 2 Bytes teilen, um die Informationen zu erhalten. und ich denke du meintest Bits – RadioSpace

+0

Absolut. Ich meine, Bits – Dudemanword

+0

Es ist nicht wirklich "wegwerfen", die Bytes sind immer noch da, es macht nur den Typ klein genug, dass eine Besetzung zu einem anderen Typ nicht zu einem Überlauf führen wird. Zumindest das, was der & tut, wirft die Besetzung weg, wenn Sie klären wollen. –

2

Es ist eine Möglichkeit, den Wert abzuschneiden, indem nur die kleinsten signifikanten Bits beibehalten werden, damit es in einem Byte "passt"!

Ich hoffe, es hilft!

7

In diesem Fall ist es ziemlich unnötig, aber die Art von Sache, die Leute "für alle Fälle" einbringen. Gemäß der JLS, 5.1.3. Narrowing Primitive Conversion

Verengung Umwandlung eines char einem ganzzahligen Typ T ebenfalls einfach verwirft alle bis auf die n niedrigstwertigen Bits, wobei n die Anzahl der Bits ist zur Behandlung von Typ T. In repräsentieren Zusätzlich zu einem möglichen Verlust von Informationen über die Größe des numerischen Werts kann dies dazu führen, der resultierende Wert eine negative Zahl sein, obwohl Zeichen 16-Bit vorzeichenlose Ganzzahlwerte darstellen.

Bei Erweiterungskonvertierungen wird häufig ein ähnlicher Code benötigt, um die Zeichenerweiterung zu unterdrücken.

+1

Es funktioniert in Java ohne die Maske/Besetzung, aber nicht in C#. C# ist ein wenig strenger bei der Verringerung von Conversions. –

+0

@RonBeyer Vielleicht wurde der Code von jemandem geschrieben, der ein bisschen C# dachte, obwohl es Java heißt. –

+2

Der Code ist Java, aber er konvertiert zu C#, also ist es nur eine wichtige Sache zu beachten, da es nicht auf der C# -Seite entfernt werden kann. –