Konflikt byte->int, in.read->arraycopy

Status
Nicht offen für weitere Antworten.

wildbret

Aktives Mitglied
Hallo,

ich empfange Daten-Frames (unsigned Bytes von C) von einem Microcontroller, der über die serielle Schnittstelle mit dem PC verbunden ist.
Dazu verwende ich das RXTX-Paket und letztendlich die read(byte[]) Methode des InputStream.

Die read-Methode kann als Puffer-Array leider nur byte[].
Bisher war das kein Problem, ich habe mit dem Byte-Feld gearbeitet und den Fehler, der sich aus dem Konflikt zwischen unsigned Byte (C) und signed Byte (JAVA) ergibt beim Zugriff manuell korrigiert.

Ich habe nun aber eine Test-Methode, mit der ich einen manuell angegebenen Frame testen kann und da in diesem Frame Werte über 128 vorkommen, muss ich den Test-Frame als Integer-Feld deklarieren. Bisher hatte ich eine extra Testklasse, was mit aber zu umständlich geworden ist.

Und genau da ist mein Problem:
Ich muss wegen der read-Methode mit byte[] arbeiten aber den Testframe muss ich als int[] deklarieren.
Code:
public void Test(){		
   int[] Frame = new int[]{0x02,0x20,0x35,0x61,0x88,0xa7,0x4c,0x1b,0x6f,0x79,0x00...};
   FrameAnalyzer fana = new FrameAnalyzer(Frame);
}

Receiver:
Code:
public void serialEvent(SerialPortEvent event) {	
		byte[] frameBuffer = new byte[0];
		byte[] buffer = new byte[512];
		int cnt = 0;
		try {
			while((cnt = in.read(buffer)) > 0) {
				// Alte Buffer-Länge + Neu gelesene bytes = Neue Buffer-Länge
				byte[] newFrameBuffer = new byte[frameBuffer.length + cnt];
				// Alten Inhalt kopieren
				System.arraycopy(frameBuffer, 0, newFrameBuffer, 0, frameBuffer.length);
				// Neuen Inhalt kopieren
				System.arraycopy(buffer, 0, newFrameBuffer, frameBuffer.length, cnt);
				frameBuffer = newFrameBuffer;
			   
				// -1 Damit das length byte immer dabei ist
				for (int i = 0 ; i < frameBuffer.length - 1; i++) {
					
					// 0x02 markiert den Start des Frames
					if(frameBuffer[i] == 0x02) {
						byte frameLength = frameBuffer[i + 1];
						
						// Kompletter Frame im Buffer?
						if(frameBuffer.length <= i + 3 + frameLength) {
							break;
						}
			         
						byte[] slicedFrame = new byte[frameLength + 4];
						System.arraycopy(frameBuffer, i, slicedFrame, 0, slicedFrame.length);
						Anzeige(slicedFrame);						
						if (slicedFrame[2]==0x35){
							@SuppressWarnings("unused")
							FrameAnalyzer fa = new FrameAnalyzer(slicedFrame);
						}						
						// Alte Buffer-Länge - Anzahl Bytes des Frames = Neue Buffer-Länge
						byte[] cutFrameBuffer = new byte[frameBuffer.length - (frameLength+4)]; 
						// Inhalt vor dem herausgeschnittenen Frame kopieren
						System.arraycopy(frameBuffer, 0, cutFrameBuffer, 0, i);
						// Inhalt nach dem herausgeschnittenen Frame kopieren
						System.arraycopy(frameBuffer, i+4+frameLength, cutFrameBuffer, i, frameBuffer.length-i-4-frameLength);

						frameBuffer = cutFrameBuffer;
					}			      
				}
			}
		} 
		catch (IOException e) {e.printStackTrace();} 
	}

Code:
public class FrameAnalyzer {
	
	public FrameAnalyzer(byte Frame[]){	
		MacExtractor(Frame);
	}
...

Durch den Receiver bitte nicht erschrecken lassen, wichtig sind nur der in.read Befehl und der Aufruf des FrameAnalyzer.
Die Klasse FrameAnalyzer kann also auf 2 unterschiedliche Arten aufgerufen werden.
Entweder über die Test-Methode, wo ich ihr ein Integer-Feld übergeben muss.
Oder über meine Receiver-Klasse, die ihr ein Byte-Feld übergibt.

3 Möglichkeiten zur Lösung sehe ich:
- den Receiver auf Int[] "umbauen"
- den Test-Frame zu byte[] machen
- Dem FrameAnalyzer ist es egal, ob er Byte[] oder Int[] übergeben bekommt, vielleicht kann man ihn dazu bringen beides zu akzeptieren.

Das read nicht mit integer kann habe ich gemerkt, als ich alle byte[] zu int[] machte.
Als nächstes habe ich versucht das byte-Feld über arraycopy in ein int-Feld zu kopieren, dank der Suchfunktion hier im Forum weiss ich nun auch wieso nicht.

Vielen Dank für eure Hilfe.
 

LinWin

Neues Mitglied
warscheinlich hilft dir diese singned=>unsigned konversion

Code:
   int_value = ( byte_value >= 0 ) ? byte_value : ( ( byte_value & 0x007F ) | 0x80 ) ;


wenn der byte-Wert größer/gleich 0, dann kann der wert einfach kopiert werden

ist der byte-Wert kleiner null, dann :
1. vorzeichenbit löschen ( wert AND 0x3F ); das ergebnis dieser operation ist bereits vom Typ int
2. das gelöschte bit nun wieder setzen ( da es ja in wirklichkeit kein Vorzeichenbit ist) - ( wert OR 0x80 )
dadurch dass das Ergebnis der ersten AND Operation bereits vom typ int ist, kannst du das zuvor gelöschte bit nun einfach wieder dazu setzen
 

wildbret

Aktives Mitglied
Danke für deine Antwort.
Ich glaube, dass dein Vorschlag in folgender Methode bereits umgesetzt ist, die ich vor ein paar Monaten auch in diesem Forum bekommen habe.

Code:
public static int unsignedByteToInt(int b) {
	return (int) b & 0xFF;  
}

Nur wie kann ich mit deren Hilfe das ganze Byte-Array zu einem Integer-Array machen?
Ich benutze die Methode unsignedByteToInt(int b) immer um 1 Byte aus dem Feld zu entnehmen und den Vorzeichenfehler zu korrigieren, so dass ich es im weiteren Verlauf benutzen kann.

z.B.
Code:
FC1 = unsignedByteToInt(Frame[3]);
FC2 = unsignedByteToInt(Frame[4]);
Seq = unsignedByteToInt(Frame[5]);
 
T

tuxedo

Gast
byte ist und bleibt byte. was sich ändert ist die "Sichtweise".

Probier doch mal folgendes (müsste so gehen):

Code:
public void Test(){      
   byte[] frame = new byte[]{(byte)0x02,(byte)0x20,(byte)0x35,(byte)0x61,(byte)0x88,(byte)0xa7,(byte)0x4c,(byte)0x1b,(byte)0x6f,(byte)0x79,(byte)0x00...};
   FrameAnalyzer fana = new FrameAnalyzer(frame);
}

Dann kannst du bei byte[] bleiben.

P.S. Variablen fangen mit Kleinbuchstaben an
 

wildbret

Aktives Mitglied
Sehr gute Idee mit dem Cast :)
Übrigens, die Methode unsignedByteToInt ist ja auch von dir alex, hattest mir damals schon super geholfen damit. :)

Danke hab es gleich umgesetzt, ob damit dann wirklich alle Probleme gelöst sind kann ich erst später beantworten, da mein Programm grade eine nicht lauffähige Baustelle ist :)

Ich melde mich dann sobald ich alle Änderungen durch habe, ich werde auch mal in meinen 1500 Seiten Code alle Variablen klein schreiben.
Bin grade eh dabei, mein Program zu verschönern, d.h. kommentieren, modularisieren und die Objektorientierung besser zu nutzen.
 
T

tuxedo

Gast
Wie schön dass Eclipse das Refactoring beherrscht ;-) Da ist das umbenennen ein klacks.
 

wildbret

Aktives Mitglied
Puh *bei 31° am PC schwitz*, ich bin nun fertig mit den Änderungen.

Ich habe das Problem nun mit Hilfe der empfohlenen "Byte Casts" gelöst, d.h. mein FrameAnalyzer funktioniert nun sowohl mit dem Test-Frame, als auch mit den "Live-Daten", die er im Betrieb vom Receiver bekommt.

Außerdem habe ich mir die Sun Namenskonventionen zu Herzen genommen und soweit ich sie für sinnvoll hielt umgesetzt. Alle Variablen- und Methodennamen fangen nun klein an und sollten die Namen aus mehreren Worten besteheden ist der 1.Buchstabe des 2.Wortes wieder groß, etc.

Noch mehr kommentiert, als sowieso schon war.

Habe meine GUI nahezu komplett vom eigentlichen Program getrennt, sodass man das Programm auch mit einer anderen GUI betrieben kann, wenn man die Methoden/Klassen richtigen benutzt.
Dazu hat mir die neue Klasse InfoTransferObject weitergeholfen, in der ich nun reichlich get- und set Methoden habe.

Ein uraltes Problem quasi nebenbei als Bafallprodukt gelöst :)

Bin nun erstmal zufrieden und total platt, seit 8 Uhr hock ich vor Eclipse.

Danke für eure Hilfe und bis zum nächsten Problem.

*Häkchen setz*
 
T

tuxedo

Gast
Bei mir isses 2° wärmer, sitze auch schon seit 08:00 und muss noch ne Stunde weiter schwitzen.

Freut mich aber für dich dass du weiter gekommen bist. Wenn man den dreh mal raus hat ist es ne feine Sache ;-)

Gruß
Alex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N JButton Konflikt mit Graphics Allgemeine Java-Themen 14
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
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
S Problem beim Einlesen von byte-werten aus datei Allgemeine Java-Themen 2
J byte-Array als String übers http schicken Allgemeine Java-Themen 8
F List<String> zu byte[] Allgemeine Java-Themen 7
L byte vs. int Allgemeine Java-Themen 6
G Umwandlung Byte in Integer Allgemeine Java-Themen 12
N Byte-Code entschlüsseln (Bitmasks?) Allgemeine Java-Themen 3
R byte - string? Allgemeine Java-Themen 10
R Stream Byte für Byte durchgehen Allgemeine Java-Themen 5
S java.io.InputStream.read(byte[] b) überschreiben Allgemeine Java-Themen 33
B boolean array = byte array (platzverbrauch) Allgemeine Java-Themen 6
L byte[] to int Allgemeine Java-Themen 2
M Vector zu einem byte[] Allgemeine Java-Themen 5
C Byte Array aus Datei erzeugen Allgemeine Java-Themen 6
T BufferedImage aus einem byte-Array? Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben