Umwandlung Byte in Integer

Status
Nicht offen für weitere Antworten.

gizmo

Bekanntes Mitglied
Ich habe eine Klasse geschrieben, welche Aufgrund von Magic Numbers den Mime Type einer Datei herausfindet. Dazu musste ich die ersten Bytes der Datei einlesen und in einen HEX-String umwandeln. Die Umwandlung funktioniert so:
Code:
for(int i = 0; i < tempBytes.length; i++) {
tempStringBuffer.append(Integer.toHexString(tempBytes[i] & 0xFF));
}
Die Variante mit dem & 0xFF habe ich im Netz gefunden. Leider verstehe ich sie nicht. Vielleicht kann es mir jemand erklären.
 

Leroy42

Top Contributor
Code:
tempBytes[i] & 0xFF

Nennt man maskieren.

Der Wert von von tempBytes[ i ], der im Computer
grundsätzlich im sogenannten 2-er Komplement
dargestellt wird, wird mit der Bitmaske
0xFF = 1111 11112 = 26510 via UND verknüpft, so daß nur
die Bits überleben (also vom ursprünglichen Wert gesetzt bleiben),
die auch auf "1" stehen. Anders gesagt: Es wird nur der Wert
von tempBytes modulo 256 geliefert.

Und nochmal anders gesagt: Es wird nur das LSB (lowest signifikant byte) des
Ursprungswerts geliefert.

Alle Klarheiten beseitigt? :cool:
 
S

SlaterB

Gast
> Anders gesagt: Es wird nur der Wert von tempBytes modulo 256 geliefert.

das sagt doch alles,
wenn du nun modulo nicht kennst, dann kann man weiterreden,
aber so ist das doch ausreichend erklärt

wenn tempBytes ein Byte ist, dann scheint mir diese Operation unnötog,
aber einen großen Integer kriegt man so klein
 

Ark

Top Contributor
Bei einer ganzzahligen Division bilden zwei Werte das Ergebnis:

Der größere Teil ist der, der bei einer Division mit gebrochenen Zahlen dem Teil vor dem Komma entspricht.

Der kleinere Teil ist der, der bei einer Division mit gebrochenen Zahlen dem Teil nach dem Komma entspricht. Das ist der Rest (Modulo). Dieser Rest wächst nicht zwingend mit dem Dividenden, sondern dreht sich im Kreis, nimmt dabei nur Werte an, die zwischen 0 und exklusive dem Divisor liegen:

Dividend : Divisor = Ganzzahlquotient Rest Modulo
0 : 7 = 0 Rest 0
1 : 7 = 0 Rest 1
2 : 7 = 0 Rest 2
3 : 7 = 0 Rest 3
4 : 7 = 0 Rest 4
5 : 7 = 0 Rest 5
6 : 7 = 0 Rest 6
7 : 7 = 1 Rest 0
8 : 7 = 1 Rest 1
9 : 7 = 1 Rest 2
10 : 7 = 1 Rest 3
11 : 7 = 1 Rest 4
12 : 7 = 1 Rest 5
13 : 7 = 1 Rest 6
14 : 7 = 2 Rest 0
15 : 7 = 2 Rest 1


Dieser Rest funktioniert quasi wie ein Kilometerzähler: Wenn die Anzahl der gefahrenen Kilometer die Darstellungsmöglichkeiten des Kilometerzählers übersteigt, dann wird der obere (größere) Teil einfach abgeschnitten.

Bei der Maskierung funktioniert das ganz genauso: Die oberen („größeren“) Bits (hier: mit Wertigkeiten über 255, also 256 und aufwärts) werden einfach durch die UND-Verknüpfung ausgeschaltet, abgeschnitten. Das funktioniert allerdings nur, wenn der Divisor eine Zweierpotenz (1, 2, 4, 8, 16, 32, …) ist, in unserem Fall 256. Die Maske hat hier übrigens immer den Wert des Divisors minus eins (also z. B. 255), gibt quasi den Maximalwert an. (Nach einer UND-Verknüpfung von A und B ist das Ergebnis nie größer als A und auch nie größer als B.)

Jetzt alle Klarheiten beseitigt!? :cool:

Ark
 

gizmo

Bekanntes Mitglied
Ja, das habe ich soweit verstanden. Wie werden denn Byte und Integer intern dargestellt?
Code:
		System.out.println(0xFF);
		System.out.println((byte)0xFF);
		System.out.println((int)0xFF);
		System.out.println((byte)0xFF & 0xFF);
		System.out.println((byte)(0xFF & 0xFF));
		System.out.println((int)(0xFF & 0xFF));
Ergibt:
Code:
255
-1
255
255
-1
255
 

Leroy42

Top Contributor
gizmo hat gesagt.:
Wie werden denn Byte und Integer intern dargestellt?

Wie ich bereits geschrieben habe: Im sogenannten 2-er Komplement

Deine merkwürdigen Ausgaben rühren daher, daß in Java sogar
der Typ byte signed ist. Ist also das höchstwertige Bit (Bit 8) in einem
Byte gesetzt, wird das Byte als negativ angesehen.
Wertebereich eines Byte in Java : [-128..127]

Das und das es überhaupt kein unsigned Byte in Java gibt,
halte ich persönlich für eine Entwurfsschwäche der SUNisten. :(
 

byte

Top Contributor
Ich halte das nicht für eine Schwäche. Ein Byte ist erstmal ein Byte, also eine Folge von 8 Bit. Der Rest ist einfach eine Frage der Interpretation. Wenn ich ein Byte ausgebe, dann wird es als signed interpretiert, also mit einem Vorzeichen-Bit. Wenn ich das Byte unsigned interpretieren möchte, kann man ja entsprechend maskieren und als int ausgeben. Computer interessiert es nicht, ob der Mensch da ein Bit als Vorzeichen interpretiert oder ein anderes Bit als Hans-Wurst. ;) Und beim Rechnen mit den Bit-Operatoren ist diese Interpretation der Bits auch egal. Oder gibt es etwas, was Du mit einem Java Byte nicht machen kannst aufgrund dieser Design-Decision?

Ich finds gut, wie es ist, denn so sind alle primitiven Typen einheitlich und unterscheiden sich lediglich in der Größe des Zahlenraums.
 

Leroy42

Top Contributor
byto hat gesagt.:
Wenn ich das Byte unsigned interpretieren möchte, kann man ja entsprechend maskieren und als int ausgeben.

Nun ja, wenn ich mit Bits rumwirbeln muß, steh' ich mit dem Java-Byte
etwas auf Kriegsfuß. Liegt aber vielleicht auch nur daran, daß ich mich
persönlich mit dem signed-Byte nicht anfreunden mag. :oops:
 

byte

Top Contributor
Ja, aber warum denn? ;) Wer mit rohen Bytes arbeitet, der verwendet eh nur Bitoperatoren (da spielt signed/ unsigned keine Rolle). Und wer arithmetische Operatoren verwendet, der braucht ja auch Vorzeichen.
 
T

tuxedo

Gast
Sorry wenn ich den alten Beitrag nochmal ausgrabe. Aber ich steht vor dem selben Problem wieder Threadstarter und schnalls gerade nicht.

Angenommen ich habe die Zahl 254. Als unsigned Bitfolge sieht das dann so aus:

Code:
11111110

Das habe ich als Byte vorliegen. Java sieht da, ohne die Konvertierung mit "& 0xFF" den Wert "-2". Das hab ich auch schon verstanden warum (Zweierkomplement und so...).

Aber wenn ich jetzt diese Bitfolge mit 0xFF, sprich 11111111, maskiere, dann bin ich doch genau so schlau wie vorher?!

Bsp:

Code:
_11111110 (die 254)
&11111111 (die Maske 0xFF)
-------------
_11111110 (das Ergebnis)

Was hat mir jetzt das maskieren gebracht? Die Bitfolge ist nach wie vor die gleiche. Und weiter hab ich ja das Problem dass ich mit 8 Bits SIGNED gar kein 254 darstellen kann, weil ja der Bereich von -128..127 geht ... Ergo müssten da noch bytes/bits dazu kommen.

Weiter ist bei Wikipedia zu lesen:

http://de.wikipedia.org/wiki/Bitweiser_Operator#UND
Das bitweise AND kann verwendet werden um eine Bitfolge zu maskieren. Dadurch können Teile eines Bitstrings isoliert werden und man kann bestimmen, ob ein bestimmtes Bit gesetzt ist oder nicht. Beispiel:

0011

Um herauszufinden, ob das dritte Bit gesetzt ist oder nicht, wird darauf ein bitweises UND mit einer Maske angewendet, die an der dritten Position eine 1 enthält:

0011
UND 0010
= 0010

Da das Ergebnis nicht Null ist, muss das dritte Bit in der ursprünglichen Bitfolge eine 1 gewesen sein. Diese Anwendung des bitweisen UND wird bitweise Maskierung genannt, weil Teile, die nicht geändert werden sollen oder für die Berechnung nicht wichtig sind, ausgeblendet werden.

D.h. die maskierung macht nur Sinn wenn ich mindestens eine 0 in der Maske habe? Weil sonst bleibt die Bitfolge ja IMMER unverändert?!

*Völligverwirrtbin*

- Alex
 
T

tuxedo

Gast
Ah, ich glaube ich verstehe ...
Ich sollte beim umrechnen mehrere Bytes mir dazudenken ...

Code:
_________11111110 (wieder 254, noch als 1 byte dargestellt )
&0000000011111111 (0x00FF, exemplarisch mal ein zusätzliches Byte, da wir wissen dass es beim umrechnen Werte geben kann die nichtmehr mit signed-byte (größe 1byte) abzudecken sind.)
-----------------
_0000000011111110

So, wenn man das jatzt aus der 2-Byte-Sicht betrachtet, so ist ganz links keine 1 mehr. Ergo ist das ganze wieder eine positive Zahl mit dem Wert 254...
Und wenn man das 0xFF weglässt, würden die hinzukommenden bytes beim casten nach Integer oder sonstwas (short, ...) wieder dazu kommen, womit dann die ganze Bitfolge links mit 1 aufgefüllt wäre, was wieder eine negative Zahl ergeben würde.

Hab ich das richtig "interpretiert" ?

- Alex
 
T

tuxedo

Gast
Ich hab mal in Java ein wenig gebastelt. Glaube meine Vermutung war richtig:

Code:
System.out.println(0xfe); // 254
System.out.println(0xff); // 255
System.out.println(0x00ff); // 255
System.out.println(0xfffe); // 65534
		
System.out.println("-----");
		
System.out.println((byte) 0xfe);
System.out.println((byte) 0xfffe);
System.out.println((int)   ((byte) 0xfe   & 0xff  ));
System.out.println((int)   ((byte) 0xfffe & 0x00ff));
System.out.println((int)   ((byte) 0xfffe & 0xff  ));

ergibt

Code:
254
255
255
65534
-----
-2
-2
254
254
254

Ergo: Mit "& 0xFF" wird nicht nur das einzelne byte das konvertiert werden soll maskiert, sondern auch die noch folgenden bytes für den Ziel-Datentyp ...

:)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Performance bei "String <-> Byte"-Umwandlung Allgemeine Java-Themen 4
S Input/Output Unicode Umwandlung Allgemeine Java-Themen 2
H Unicode ausgeben ohne Umwandlung - geht das? Allgemeine Java-Themen 3
M Umwandlung ByteArrayOutputStream in InputStream Allgemeine Java-Themen 5
A Umwandlung String --> Int un umgekehrt Allgemeine Java-Themen 18
A Umwandlung von Text/Zeichen in Polynome Allgemeine Java-Themen 8
O Problem bei der Umwandlung von Hex-Werten Allgemeine Java-Themen 5
G Umwandlung Hex nach Dezimal Allgemeine Java-Themen 3
R Umwandlung Farbe in Schwarz/Weiss Allgemeine Java-Themen 2
L String umwandlung Allgemeine Java-Themen 3
A Probleme Umwandlung Ausdruck String in double Allgemeine Java-Themen 4
G Umwandlung in Stream Allgemeine Java-Themen 5
M Umwandlung eines Long-Wertes in einen String Allgemeine Java-Themen 2
S Hex und Dezimal Umwandlung? Allgemeine Java-Themen 3
LucasGlockner Effizienter byte-Zugriff auf ein long[]-Array Allgemeine Java-Themen 8
Encera Größe eines Objektes in Byte berechnen Allgemeine Java-Themen 2
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
Noahscript Aus einem byte Array Steuerungszeichen und Code bekommen und ersetzen Allgemeine Java-Themen 3
Thallius unsigned byte Allgemeine Java-Themen 18
N Byte Array in Java "dekomprimieren" Allgemeine Java-Themen 3
kodela Datentypen byte als unsigned interpretieren Allgemeine Java-Themen 23
W String -> byte[] -> String - Sieht jemand was ich nicht sehe? Allgemeine Java-Themen 10
TheWhiteShadow 2D-Grafik GIF Library mit byte output Allgemeine Java-Themen 10
K Data Konverter - Probleme mit Byte[] Kodierung Allgemeine Java-Themen 3
kodela Byte Order Mark (BOM) bei readLine() ignorieren Allgemeine Java-Themen 5
A Byte zu String Allgemeine Java-Themen 4
RalleYTN Datentypen Unsignierter Byte zum signierten Byte Allgemeine Java-Themen 2
X Datentypen Byte geht nicht höher als 126 auch nicht mit casten? Allgemeine Java-Themen 22
R Byte Array Zeichensuche Allgemeine Java-Themen 6
M Null byte in verschiedenen charsets Allgemeine Java-Themen 2
S Byte Array welches in Laufzeit aufgelöst wird // Objekt Array Allgemeine Java-Themen 3
O Byte-Array zu String Allgemeine Java-Themen 7
D Decodierung von Mp3-byte[] Allgemeine Java-Themen 4
A ByteBuffer.get(byte[] dst,int offset,int length) Allgemeine Java-Themen 2
A RandomAccessFile.read(byte[] b) Allgemeine Java-Themen 9
P Datentypen Warum überhaupt Byte ? Allgemeine Java-Themen 12
P Datentypen String-Daten zu Byte-Zahlen konvertieren - Komme nicht weiter nach vielem versuchen :-/ Allgemeine Java-Themen 7
E Byte zu String & umgekehrt Allgemeine Java-Themen 3
B BufferedWriter in InputStream oder Zeichen-Stream in Byte-Stream Allgemeine Java-Themen 5
M Chart per byte[] in JSP anzeigen Allgemeine Java-Themen 4
E int in byte Allgemeine Java-Themen 6
R ArrayList byte[] abspeichern Allgemeine Java-Themen 4
S byte [] in string und zurück konvertieren Allgemeine Java-Themen 2
G byte ? : Allgemeine Java-Themen 7
E Byte-Array to String: Zeichenkaputt Allgemeine Java-Themen 11
R In einem Byte-Array nach einer gewissen Zahlenfolge suchen Allgemeine Java-Themen 7
hdi Speicherbelegung byte, short, int Allgemeine Java-Themen 8
J byte - hex - byte.. casten Allgemeine Java-Themen 8
R byte[] to String Konvertieren Allgemeine Java-Themen 14
A Input/Output Buffered Image zu Byte Array und zurück konvertieren Allgemeine Java-Themen 4
M byte array splitten Allgemeine Java-Themen 3
J Hex-String zu byte transformieren Allgemeine Java-Themen 7
T Zu doof für byte-Umrechnung ... Allgemeine Java-Themen 3
W CRC32 aus byte array Allgemeine Java-Themen 5
F byte[] aus einem BufferedImage Allgemeine Java-Themen 3
L byte -> byte[1] -> byte Allgemeine Java-Themen 2
P Einzelne Bits in einem Byte-Array setzen Allgemeine Java-Themen 2
Kr0e Synchronisieren: boolean,byte,char ? Allgemeine Java-Themen 2
S Überprüfung/Parsen eines Byte-Arrays Allgemeine Java-Themen 9
Semox Byte-Manipulation eines Bildes Allgemeine Java-Themen 7
Meldanor For-Schleifen - byte statt int? Allgemeine Java-Themen 11
C int zu byte cast - verständnis Allgemeine Java-Themen 3
R int to byte[] Array Allgemeine Java-Themen 4
MQue byte[] Array to Integer Allgemeine Java-Themen 4
MQue Byte to Int convertieren Allgemeine Java-Themen 2
R Double Werte aus byte[] auslesen Allgemeine Java-Themen 5
W Verwendung von byte Allgemeine Java-Themen 9
G zu lange Byte code dateien Allgemeine Java-Themen 6
G String in byte- Array Allgemeine Java-Themen 3
E Byte [] nach hex, dann nach dec Allgemeine Java-Themen 2
A Performance: byte[] in byte[][][] konvertieren Allgemeine Java-Themen 2
G 2 x byte zusammenkopieren Allgemeine Java-Themen 7
G byte nach int Allgemeine Java-Themen 3
foobar Object to byte[] ohne Serializable Allgemeine Java-Themen 6
data89 Die Größe eines Strings in Byte berechnen? Allgemeine Java-Themen 12
G Byte- List mit einem Iterator durchlaufen Allgemeine Java-Themen 5
W Konflikt byte->int, in.read->arraycopy Allgemeine Java-Themen 7
T "unsigned" byte[] -> BigInteger Allgemeine Java-Themen 2
F byte in hex-String oder: Wer hat in Mathe aufgepasst Allgemeine Java-Themen 3
T Socket Server Anwendung - Empfang eines Byte-Arrays Allgemeine Java-Themen 7
J NumberFormatException bei String->byte[] Allgemeine Java-Themen 12
ARadauer Blob aus byte Array erstellen? Allgemeine Java-Themen 3
T Object -> byte[] Allgemeine Java-Themen 5
G Byte[] zeichenweise lesen Allgemeine Java-Themen 4
G byte[] mit Strings füllen Allgemeine Java-Themen 2
B int -> byte Allgemeine Java-Themen 2
G file --> byte[] Allgemeine Java-Themen 7
E Problem beim Dateien kodieren ("Byte = Byte +1") Allgemeine Java-Themen 3
I String -> byte[] -> String Allgemeine Java-Themen 2
D byte nach integer? Allgemeine Java-Themen 4
MQue int in byte Allgemeine Java-Themen 18
G Maximalgröße von byte[] buffer Allgemeine Java-Themen 7
E String -> byte[] Allgemeine Java-Themen 6
C Byte[] to String Allgemeine Java-Themen 7
D datei in byte[]-array schreiben Allgemeine Java-Themen 6
D byte[] problem Allgemeine Java-Themen 3
MQue ArrayList in ein byte- Array Allgemeine Java-Themen 7
B ein spezielles Byte-Array sortieren Allgemeine Java-Themen 11
T OutputStream - Event bei Byte-Fluss Allgemeine Java-Themen 5
J byte-Array in Hashmap speichern? Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben