Hex Strings in Hex array

huckleberry

Bekanntes Mitglied
Hallo,

ich habe HEX Strings, etwa: "0123456789ABCDEF"

Diese würde ich gerne in ein byte [] Packen:

Java:
payload = new byte[]{0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};

Für Elemente größer als 127 bekomme ich ein:
Type mismatch: cannot convert from int to byte

Ich würde gerne binär arbeiten und verstehe die Meldung nicht.

Bin dankbar für hinweise..

MfG Huck
 
S

SlaterB

Gast
byte geht aber auch ins negative, 256 unterschiedliche Werte von 00 bis FF kann man schon darstellen,
auf (byte) casten und evtl. vorher -128 rechnen
 

AquaBall

Top Contributor
byte geht aber auch ins negative, 256 unterschiedliche Werte von 00 bis FF kann man schon darstellen,
auf (byte) casten und evtl. vorher -128 rechnen

Falls es huckleberry nicht klar ist:
Nicht "EVTL.", sondern "IMMER" davor "-128" (=0x80) rechnen, wenn auch nur 1 Wert über 0x7F / 127 möglich sein soll!
Sonst weißt du nachher nie ob z.B. 0x03 nun eine 3 oder 3+128=131 sein soll.
 
S

SlaterB

Gast
kommt darauf an, wie man die Verteilung haben will,
rechnet man nicht -128, dann werden die großen Zahlen automatisch ins negative geschoben,
Java:
public class Test
{
    public static void main(String[] args)
    {
        for (int i = 0; i < 256; i++)
        {
            System.out.println("i: " + i + ", " + ((byte)i) + ", " + ((byte)(i - 128)));
        }
    }
}

die rechte Reihe hier, mit -128, ist aber sicher die schönere
 

AquaBall

Top Contributor
Funktioniert ein cast (byte)(217)?
Dann müsste der cast (byte)(217) == (byte)(-39) das selbe ergeben?!
Wenn's so ist, dann kann man sich -128 wohl sparen.
(Ich hab ich nie getestet, und war der Meinung, es müsste craschen.
Lerne aber gerne dazu.)

Dann stellt sich nur noch für Ausgabe die Frage, wie das eigentliche Problem am elegantesten umgesetzt werden kann:
ich habe HEX Strings, etwa: "0123456789ABCDEF"

------------------------
Edit:
Slater macht ja schön vor, wie die WerteListe aussehen kann.
 
Zuletzt bearbeitet:

Attila

Bekanntes Mitglied
Java:
byte b = (byte)(129);
int unsignedByte = b & 0xff;		
System.out.println(unsignedByte);   // 129
System.out.println(b);                    // -127
 
S

SlaterB

Gast
gewagte differenzierende Anerkennung,
nachdem du dich vorher mit mir unterhalten hast und ich auch
System.out.println()
kodiert hatte ;)
von Ausgabe als Kommentar direkt dahinter sagt deine Signatur nichts ;)
 

AquaBall

Top Contributor
Sorry, Slater!

War eigentlich als Kritik an mich selbst gerichtet:
Ich @michselbst: probiers doch aus, statt lang zu rätseln! Du Dödl!

Ich wollte deinen Beitrag nicht minder schätzen!
 

Sesostris

Aktives Mitglied
Kann mir bei der Gelegenheit jemand erklären, wozu dieser "dirty hack" gut sein soll? Ich dachte, die JVM rechnet intern sowieso mit mindestens 4 Byte langen Werten - egal ob byte, short oder eben int.
 
S

SlaterB

Gast
was soll denn ein hack sein? Daten als byte 'zu haben' ist schon ein wichtiger Schritt allgemein,
wenn man sie an Streams schicken will oder was auch immer,
hier von String aus zwingender Schritt, auch bei int wie man sieht nicht ganz ohne,
wobei man theoretisch mit int gut im byte-Bereich arbeiten könnte

OutputStream hat dann auch eine Methode write(int b)
Writes the specified byte to this output stream. The general contract for write is that one byte is written to the output stream.
The byte to be written is the eight low-order bits of the argument b. The 24 high-order bits of b are ignored.
 

Sesostris

Aktives Mitglied
Java hat nunmal keine "unsigned bytes" - insofern erscheint mir der Versuch, Werte größer 127 in ein byte speichern zu wollen, als kein sonderlich guter Stil, der sich leicht vermeiden liese, indem man sofort ints nimmt. Und meines Wissens nach - siehe obiger Beitrag - besitzen bytes keine Vorteile gegenüber ints.
 
S

SlaterB

Gast
nun, bytes haben den famosen Vorteil, dass alle Computer der Welt danach ihr Fähnchen hängen,

wenn du eine Datei lesen/ schreiben bzw. dich irgendwie außerhalb des Java-Sandkasten-abgeschlossen-Arbeitsspeicher bewegst,
musst du dich schlicht danach richten, mag mehr Notwendigkeit als Vorteil sein,
 

huckleberry

Bekanntes Mitglied
Ok, ich habe mich wohl undeutlich ausgedrückt. Also nochmal:

Mir ist es völlig wurscht, ob die JVM die Elemente als signed, unsigned, 4 Kilo Äpfel oder eine Sahnetorte interpretiert. Wenn ich ein 0xFF in ein byte [] reinschiebe, dann soll dort 0xFF stehen und ich möchte keine Fehlermeldung.

Also muss ich einzelne Elemente casten:
Java:
payload = new byte[]{0x10, 0x09, 0x2E, (byte) 0xF1, (byte) 0x98, 0x03, (byte) 0x86, (byte) 0xC1};
Solange sich der Hex-Wert nicht ändert passt das.
 
S

SlaterB

Gast
es sollte dich schon interessieren, welchen Wertebereich byte hat und ob die Werte durch das Casten geändert werden..,
naja, wenn es wichtig ist wird es irgendwann schon auffallen

falls dir deine Codezeile zuviel Schreibarbeit ist und noch öfter ähnliches kommt, könntest du dir eine Methode mit int... als beliebig langen Parameter definieren, intern ein byte[] erstellen und zurückgeben,
dann sieht es so aus:

Java:
payload = make(0x10, 0x09, 0x2E, 0xF1, 0x45980, -42, .. );
die Methode könnte auch prüfen, ob die Einzelwerte zumindest zwischen 0 und 255 liegen, egal wie dann auf byte abgebildet,
und für andere ne Fehlermeldung ausgeben
 

AquaBall

Top Contributor
Wenn du gesichert für "00" den Wert 0x00 in deinem Feld haben willst, und für "FF" den Wert 0xff =255d, dann musst du doch ein bisschen Grips reinstecken (ein bisschen).

Denn es ist eine Ding 255 Werte (irgendwie) eindeutig zu codieren, aber es ist ganz anderes Ding das identische BitMuster im Byte zu erzwingen. (Ohne Fallunterscheidung gehts nicht)

Aber du schaffst das schon, beschäftige dich mal mit den 2er-Kompliment:
0x0000 => 0 => 0x00 => 0
0x0001 => 1 => 0x01 => 1
...
0x007F => 127 => 0x7F => 127
0x0080 => 128 => 0x80 => -128 !!!
0x0081 => 129 => 0x81 => -127 !!!
...
0x00FE => 254 => 0xFE => -2
0x00FF => 255 => 0xFF => -1
0x0100 => 256 => 0x00 => oops, oor
 

Sesostris

Aktives Mitglied
Wenn ich ein 0xFF in ein byte [] reinschiebe, dann soll dort 0xFF stehen und ich möchte keine Fehlermeldung.
Das geht in Java aber nicht; eine Variable vom Typ byte kann nicht den Wert 255 enthalten. Du kannst dir lediglich - wie SlaterB vorgeschlagen hat - eine (bijektive!) Funktion schreiben, die dir Integer-Werte im Bereich 0 bis 255 auf eine Variable vom Typ byte abbildet.
Sinnigerweise solltest du aber dann aber auch die dazu inverse Funktion haben, um mit den Werten weiterarbeiten zu können.

Java:
public class Demo {
	public static void main (String[] args) {
		int[] payloadInt = new int[]{0x10, 0x09, 0x2E, 0xF1, 0x98, 0x03, 0x86, 0xC1};
		byte[] payloadByte = intToByte(payloadInt);
		
		for (int i: payloadInt)
			System.out.print(Integer.toHexString(i) + " ");
		System.out.println();
		
		for (int i: byteToInt(payloadByte))
			System.out.print(Integer.toHexString(i) + " ");
		System.out.println();		
	}
	
	public static byte[] intToByte(int[] intArray) {
		byte[] byteArray = new byte[intArray.length];
		for (int i=0; i<intArray.length; i++)
			if (0 <= intArray[i] && intArray[i] <= 255)
				byteArray[i] = (byte) intArray[i];
			else
				throw new IllegalStateException("foo");
		return byteArray;
	}
	
	public static int[] byteToInt(byte[] byteArray) {
		int[] intArray = new int[byteArray.length];
		for (int i=0; i<byteArray.length; i++)
			intArray[i] = byteArray[i] & 0xff;
		return intArray;
	}
}

Das bliebe dir allerdings erspart, wenn du von Anfang an ein int-Array verwenden würdest.
Java:
int[] payload = new int[]{0x10, 0x09, 0x2E, 0xF1, 0x98, 0x03, 0x86, 0xC1};


@AquaBall:
Die Bitmuster sind doch im Zweierkomplement bereits ident.
Als int: 0xFF = 255 (d) = 1111 1111 (b)
Nach einem Cast zum Byte: -1 (d) = 1111 1111 (b)
Nur die Interpretation ist eine andere, da sich das MSB ändert. Bei der ersten Ziffernfolge wäre das MSB 0 (da die ersten 24 Stellen mit Nullen aufgefüllt sind), also wird die Zahl als positive Zahl interpretiert. Die zweite Zahl hat nur acht Stellen (da vom Typ Byte), d. h. die erste Stelle ist eine 1 und wird folglich als negative Zahl interpretiert. Aber die Bitmuster sind - wenn man sich auf die letzten acht Stellen beschränkt - jeweils die gleichen.
 

AquaBall

Top Contributor
Die Bitmuster sind doch im Zweierkomplement bereits ident.
Als int: 0xFF = 255 (d) = 1111 1111 (b)
Nach einem Cast zum Byte: -1 (d) = 1111 1111 (b)
Nur die Interpretation ist eine andere, da sich das MSB ändert.

Genau das mein' ich auch: Wenn er die Daten wieder lesen will (Wozu sonst speichern), dann kommt er um eine Fallunterscheidung nicht herum, weil sich die Interpretation ändert.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Strings in String Array schreiben Java Basics - Anfänger-Themen 13
B mir nur die Gesamtzahl von einzigartigen Strings aus Array ausgeben lassen Java Basics - Anfänger-Themen 5
R Übergeben eines Array Strings an einen Spinner Java Basics - Anfänger-Themen 4
L Prüfe, ob die im String Array enthaltenen Strings aufsteigend sind. Java Basics - Anfänger-Themen 19
J Variablen Strings mit Zeilenumbrüchen in neues Array Element Java Basics - Anfänger-Themen 1
S Strings im Array nach Namen sortieren Java Basics - Anfänger-Themen 11
A Variablen String Array in einzelne Strings auspalten Java Basics - Anfänger-Themen 4
U Array von Strings Java Basics - Anfänger-Themen 10
T Array mit Strings befüllen Java Basics - Anfänger-Themen 4
J Einem String-Array in einer for-Schleife Strings zuweisen - Klappt nicht in einer for-Schleife Java Basics - Anfänger-Themen 5
T Strings mit compareto vergleichen und array sortieren Java Basics - Anfänger-Themen 14
S Array Strings zuordnen Java Basics - Anfänger-Themen 13
J Strings aus einer Datei in 2D Array schreiben Java Basics - Anfänger-Themen 3
B Strings aus Array einlesen klappt nicht Java Basics - Anfänger-Themen 5
T Anzahl eines Strings in einem String-Array Java Basics - Anfänger-Themen 5
N Importieren von Wörtern aus Datei als Array von Strings Java Basics - Anfänger-Themen 2
T Länge von Strings im Array vergleichen Java Basics - Anfänger-Themen 2
K Strings in Array einlesen Java Basics - Anfänger-Themen 3
M Array mit Strings? Java Basics - Anfänger-Themen 4
F Array mit Strings Java Basics - Anfänger-Themen 7
kulturfenster Array mit Strings sortieren Java Basics - Anfänger-Themen 7
W Gleichzeitiges ersetzen mehrerer Strings Java Basics - Anfänger-Themen 7
R Datentypen Das Verhalten von Strings als Datentypen Java Basics - Anfänger-Themen 7
N Nachkommastellen von Strings Java Basics - Anfänger-Themen 3
T Strings unveränderlich???? Java Basics - Anfänger-Themen 22
B Alle Strings bis zu einer Maimallänge aufzählen, die Bedingung erfüllen Java Basics - Anfänger-Themen 13
S Die durchschnittliche Länge der Strings Java Basics - Anfänger-Themen 11
M Operatoren Strings mit Vergleichsoperatoren, funktioniert das? Java Basics - Anfänger-Themen 9
S Variablen Letzte Zeile eines Strings entfernen Java Basics - Anfänger-Themen 1
D Strings aus Excel-Datei einlesen Java Basics - Anfänger-Themen 2
P9cman Tipps für Rekursive Aufgaben mit Strings oder allgemein Java Basics - Anfänger-Themen 2
sserio StringBuilder und Strings Java Basics - Anfänger-Themen 8
J Größe eines Strings in Pixel Java Basics - Anfänger-Themen 18
schredder Strings und reguläre Ausdrücke - Methode mit return string.matches Java Basics - Anfänger-Themen 5
B Konkatenieren eines Strings und inkremtierenden Zahl zu einer INT Variablen Java Basics - Anfänger-Themen 7
N Strings verpflechten Java Basics - Anfänger-Themen 4
G Strings auf Gleichheit prüfen - Aufgabe vom Prof. Java Basics - Anfänger-Themen 5
A 2 Strings vergleichen in einer methode wenn man mit Globalen variablen arbeitet Java Basics - Anfänger-Themen 12
L Strings aneinanderhängen Java Basics - Anfänger-Themen 2
M Strings vergleichen Java Basics - Anfänger-Themen 10
Nerdinfekt BMI Rechner, fehler beim Zurückgeben des Strings? Java Basics - Anfänger-Themen 2
U Problem mit dem initialisieren meines Strings in einer Schleife Java Basics - Anfänger-Themen 5
S 2 Strings mit Equals vergleichen Java Basics - Anfänger-Themen 11
Q Besitzen zwei Strings identische Buchstaben, nur in anderer Reihenfolge? Java Basics - Anfänger-Themen 10
marcooooo Separator zwischen allen Zeichen eines Strings einfügen Java Basics - Anfänger-Themen 29
C Ternärer Operator mit Strings Java Basics - Anfänger-Themen 3
M Wie kann ich bei int-Variablen im exception handler auf bestimmte Strings reagieren? Java Basics - Anfänger-Themen 5
P Verketten, Aneinanderreihen von Strings Java Basics - Anfänger-Themen 2
M Strings mit gerader und ungerader Länge ausgeben Java Basics - Anfänger-Themen 10
J Alle Werte eines Strings zusammen addieren Java Basics - Anfänger-Themen 15
W Strings und das parsen Java Basics - Anfänger-Themen 8
D Frage zu Strings einer Exception Java Basics - Anfänger-Themen 4
D Vergleichen von Strings Java Basics - Anfänger-Themen 6
M Konkatenation von zwei Strings Java Basics - Anfänger-Themen 6
J Abbruchbedingung in Schleife/ Untersuchung von Strings Java Basics - Anfänger-Themen 2
S Buchstaben in Großbuchstaben (Strings) Java Basics - Anfänger-Themen 5
X Anagramm mit Strings und Methode Java Basics - Anfänger-Themen 53
P geschachtelte Schleife mit Strings Java Basics - Anfänger-Themen 2
P Strings mit der Axt zerteilen Java Basics - Anfänger-Themen 7
F Alle Zeichenkombinationen eines Strings iterativ herausfinden Java Basics - Anfänger-Themen 26
K Strings hochzählen Java Basics - Anfänger-Themen 20
J Strings untereinander in einer Liste vergleichen Java Basics - Anfänger-Themen 18
B Frage zu: String... strings -> Ungleiche Anzahl an Parameter? Java Basics - Anfänger-Themen 4
F Vergleiche mit charAt funktioniert bei Strings nicht, was tun? Java Basics - Anfänger-Themen 5
T Probleme mit Strings Java Basics - Anfänger-Themen 6
J Unveränderbarkeit von Strings Java Basics - Anfänger-Themen 3
O Klammerung bei Strings Java Basics - Anfänger-Themen 10
A Liste aus drei Strings erstellen Java Basics - Anfänger-Themen 5
N Zwei Strings mit "==" vergleichen warum TRUE Java Basics - Anfänger-Themen 2
G Teil(e) eines Strings entfernen wenn spezifische Zeichen (< & >) vorkommen Java Basics - Anfänger-Themen 5
D ergebnis.matches("[1-9]?[0-9].[0-9][0-9]?") ein teil eines größeren Strings Java Basics - Anfänger-Themen 12
J Breite eines Strings bestimmen Java Basics - Anfänger-Themen 4
D Zwei Strings sind gleich bei if aber nicht true Java Basics - Anfänger-Themen 2
F JList Elemente mit Strings vergleichen Java Basics - Anfänger-Themen 12
J Strings sind gleich werden aber ungleich ausgewertet Java Basics - Anfänger-Themen 2
N Vergleich von Strings schlägt fehl.. Java Basics - Anfänger-Themen 5
B 4 Strings, Anfangsbuchstaben muss unterschiedlich sein Java Basics - Anfänger-Themen 12
J Input/Output Strings aneinander reihen mit while schleife Java Basics - Anfänger-Themen 25
R Erste Schritte Sicheres einlesen eines Strings Java Basics - Anfänger-Themen 2
F Maximale Länge eines Strings Java Basics - Anfänger-Themen 5
J Best Practice Datum Differenz aus zwei Strings ermitteln Java Basics - Anfänger-Themen 8
Jinnai4 Strings ersetzen Java Basics - Anfänger-Themen 9
L Rekursiv zwei Strings vergleichen Java Basics - Anfänger-Themen 3
J Algorithmus - Strings auf eigene Reihenfolge miteinander vergleichen Java Basics - Anfänger-Themen 4
DaCrazyJavaExpert Variablen Zahlen aus Strings auslesen Java Basics - Anfänger-Themen 4
C 2 Strings Java Basics - Anfänger-Themen 15
T befehle unterschiedlicher anzahl an strings wiedergeben Java Basics - Anfänger-Themen 2
JavaNewbie2.0 Strings in andere Klassen importieren. Java Basics - Anfänger-Themen 2
D BlueJ Java: Strings voneinander trennen Java Basics - Anfänger-Themen 11
javaerd Wie kann ich Brute Force Methode mit Strings erweitern Java Basics - Anfänger-Themen 1
R Erste Schritte Strings "einrücken" Java Basics - Anfänger-Themen 3
Yamie ArrayList<Object> als Liste von Strings ausgeben? Java Basics - Anfänger-Themen 15
B gemeinsames Vorkommen der charactere von 2 Strings als String zurückgeben Java Basics - Anfänger-Themen 5
R Teilinhalt eines Strings testen Java Basics - Anfänger-Themen 10
H Erste Schritte JTree: Instanzen einer Klasse speichern oder Namen/Strings... Java Basics - Anfänger-Themen 4
L Werte von Strings ? Java Basics - Anfänger-Themen 1
L Strings und Arrays - Expand Java Basics - Anfänger-Themen 12
I Schachbrett aus beliebigen Strings erstellen Java Basics - Anfänger-Themen 3
Syncopated Pandemonium Verketten von Strings funktioniert nicht Java Basics - Anfänger-Themen 4
F Wahrscheinlichkeit von Strings Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben