ByteBuffer verschlüsseln

Kruemel

Mitglied
Guten Morgen!

Warum kann man einem ByteBuffer der einer Methode übergeben wird nicht einen anderen zuweisen?

Java:
public void crypt(ByteBuffer bytes){
		
	ByteBuffer ret = ByteBuffer.allocate(bytes.limit());

	bytes.position(0);
	int i=0;
		
	while(bytes.hasRemaining()){
		ret.put((byte)(bytes.get()+key[i++]));	
			
		if(i==key.length)
			i=0;
	}
		
	ret.position(0);
	bytes=ret; //<-- Warum will das nicht klappen?! :-(
}

Wenn ich den Bytebuffer mit return zurückgebe funktioniert das einwandfrei, an der Funktion selbst kann es nicht liegen...

Gruß,
Kruemel
 

André Uhres

Top Contributor
Hallo Kruemel.

das geht nicht, weil Java die Methodenargumente nicht "by reference" übergibt, sondern "by value". Du hast also keinen Zugriff auf die ursprüngliche Referenzvariable.

Du kannst aber über eine put Methode die bytes des Objektes verändern, auf das die übergebene Referenz zeigt.

Gruß,
André
 
Zuletzt bearbeitet:

Andi_CH

Top Contributor
Das ist Java - was du als Parameter bekommst ist eine Kopie.

Sieh dir das mal an:

Java:
public class Test3 {
	
	static int i = 42;

	public static void foo ( int zahl) {
		System.out.println("foo : Parameter = " + zahl);
		zahl = 57;
		System.out.println("foo : Parameter nach Zuweisung = " + zahl);
	}

	public static void main(String[] args) {
		System.out.println("Main - Anfang. i = " + i);
		foo(i);
		System.out.println("Main - nach Aufruf von foo. i = " + i);
	}
}

Ausgabe:
Code:
Main - Anfang. i = 42
foo : Parameter = 42
foo : Parameter nach Zuweisung = 57
Main - nach Aufruf von foo. i = 42

Du kannst den Parameter zwar verändern, aber eben, er ist ja eine Kopie.
Wie man das Original verändern kannst hast du ja erwähnt.

Java:
public class Test3 {
	
	static int i = 42;

	public static int foo ( int zahl) {
		System.out.println("foo : Parameter = " + zahl);
		zahl = 57;
		System.out.println("foo : Parameter nach Zuweisung = " + zahl);
		return zahl;
	}

	public static void main(String[] args) {
		System.out.println("Main - Anfang. i = " + i);
		i = foo(i);
		System.out.println("Main - nach Aufruf von foo. i = " + i);
	}
}

Ausgabe:
Code:
Main - Anfang. i = 42
foo : Parameter = 42
foo : Parameter nach Zuweisung = 57
Main - nach Aufruf von foo. i = 57
 
S

SlaterB

Gast
oder du übergibst von außen eine höhere Objektebene,
wenn z.B. ein Objekt der Klasse
Java:
class XYData {
   ByteBuffer bytes;
}
übergeben wurde, dann kann wiederum kein neues XYData-Objekt zurückgegeben werden,
wohl aber in diesem Objekt ein neuer ByteBuffer gesetzt werden
 
G

Gastredner

Gast
Alle Parameter werden bei Java über call by value - also durch Kopie - übergeben. Dies gilt auch für die Objektreferenzen. Da deine Methode die Referenz kopiert bekommt und nicht das Objekt selbst, kannst du über den Namen des Parameters das Objekt verändern. Weißt du dem Namen jedoch eine neue Referenz zu, verlierst du deine Kopie der Referenz auf das Originalobjekt. Zuweisungen wie bei C/C++ sind bei Java (glücklicherweise?) nicht möglich.
 

André Uhres

Top Contributor
Ich empfehle dir, die Methodenargumente immer als "final" zu deklarieren, dann kommen solche Fehler nicht vor:
Java:
public void crypt(final ByteBuffer bytes) {...

Gruß,
André
 

Kruemel

Mitglied
Danke für die schnellen Antworten.

Ich dachte das nur primitive Datentypen als Kopie übergeben werden. Objekte wie ByteBuffer dachte ich würden lediglich als Referenz übergeben werden...

Schade drum...

Wäre es vlt. besser in diesem Fall ein byte[] zu verwenden? Der Speicherverbrauch eines ByteBuffers und der des Array sollten ja identisch sein. Und ein übergebenes Bytearray wäre ja veränderbar...

Gruß, Kruemel
 
M

maki

Gast
Wäre es vlt. besser in diesem Fall ein byte[] zu verwenden?
Dann hättest du Haargenau das gleiche Problem.

Dir ist schon klar dass diese Zeile nicht funzt wie du willst?
Java:
bytes=ret;
Du weist den Wert einer Referenz dem einer anderen zu, nichts weiter.
Da bytes aber schon eine Kopie eines Referenzwertes ist, hat das keine Auswirkungen.

Räum doch mal deine Methode auf, Input Parameter zu verändern ist fast immer böse und funktioniert auch nicht wie du willst, dafür nimmt man Rückgabewerte.
Was du eigentlich willst ist also keine void Methode, sondern eine, die dir einen ByteBuffer zurückgibt.
 
S

SlaterB

Gast
@Kruemel
schlimme Sätze, die du da formulierst..

> Objekte wie ByteBuffer dachte ich würden lediglich als Referenz übergeben werden...

werden sie auch, inwiefern siehst du dabei einen Widerspruch zum bisher von allen gesagten?
benutze bitte keine Andeutungen sondern stelle deine Gedanken und Probleme ausführlich und genau dar, wenn du dazu noch etwas klären willst

> Und ein übergebenes Bytearray wäre ja veränderbar...

der Bytebuffer genauso??
du kannst keinen NEUEN ANDEREN Bytebuffer ohne Rückgabewert zum Aufrufer hinschummeln, genauso wenig ein NEUES ANDERES Arrays,
verändern ist bei beiden denkbar
 

André Uhres

Top Contributor
Es wird ja keine Kopie des Objektes gemacht, sondern lediglich eine Kopie der Referenz. Bei einem byte array ist es ganz genau dasselbe. Solange du nicht nicht die Referenz, sondern einfach nur das übergebene Objekt veränderst: kein Problem!

Gruß,
André
 

Kruemel

Mitglied
"Kopie der Referenz", jetzt ist mir einiges klargeworden ^^

Nein, mit dem byte[] funktioniert das ganze:

Java:
public void crypt(byte[] bytes){
		
	for(int i=0, j=0; i<bytes.length; i++, j++){			
		if(j==key.length)
			j=0;
			
		bytes[i]=(byte)(bytes[i]+key[j]);			
	}
		
}

Gruß, Kruemel

Thx@all für eure Antworten und Geduld.
 

André Uhres

Top Contributor
Das funktioniert, weil die Referenz nicht verändert wird. Du kannst (besser: du solltest) sie als "final" deklarieren:
Java:
public void crypt(final byte[] bytes) {

Gruß,
André
 

Kruemel

Mitglied
Alles klar.

In meinem ersten Beispiel habe ich quasi der Kopie der Referenz eine neue Referenz zugewiesen. Innerhalb der Crypt Methode ist das kein Problem, beide Referenzen zeigen auf den gleichen ByteBuffer, nur in der aufrufenden Methode bleibt das ganze -logischerweiße- ohne Effekt.

Ist die byte[] Lösung besser? Es ist schließlich keine Kopie nötig (weniger Speicherverbrauch...?)

Kruemel
 
G

Gastredner

Gast
Ob du jetzt ein byte[] oder einen ByteBuffer übergibst, beides ist einfach nur eine Referenz und sollte daher denselben Speicherverbrauch aufweisen.
Über den Speicherverbrauch müsstest du höchstens dann nachdenken, wenn du innerhalb deiner Methode eine Kopie des als Parameters übergebenen ByteBuffers anlegst und der Buffer sehr groß ist.
 

André Uhres

Top Contributor
Ist die byte[] Lösung besser? Es ist schließlich keine Kopie nötig (weniger Speicherverbrauch...?)

Du hattest am Anfang "ByteBuffer.allocate" benutzt. Dadurch wird eine Kopie erzeugt. Aber, wie bereits gesagt, du kannst auch über eine put Methode die bytes des ursprünglichen ByteBuffer Objektes direkt verändern, ohne eine Kopie zu benötigen. In dem Fall bedeutet das den selben Speicherverbrauch wie bei der byte[] Lösung.

Gruß,
André
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D ByteBuffer getInt NullpointerException Allgemeine Java-Themen 4
A ByteBuffer.get(byte[] dst,int offset,int length) Allgemeine Java-Themen 2
Luk10 Fragen zum ByteBuffer (lwjgl - icons) Allgemeine Java-Themen 2
G ByteBuffer -> String und String -> ByteBuffer Allgemeine Java-Themen 2
T S: Passenden "Container" for ByteBUffer Pool Allgemeine Java-Themen 6
A IntBuffer zurück zu ByteBuffer Allgemeine Java-Themen 1
T ByteBuffer Allgemeine Java-Themen 5
thE_29 ByteBuffer -- wie funktioniert der? Allgemeine Java-Themen 7
N ByteBuffer-Problem Allgemeine Java-Themen 17
T Verschlüsseln Allgemeine Java-Themen 18
C Email mit public-key verschlüsseln Allgemeine Java-Themen 0
J Interpreter-Fehler Fehler beim Verschlüsseln Invalid AES key length Allgemeine Java-Themen 1
D Passwort verschlüsseln - Wo Allgemeine Java-Themen 2
L Methoden Methode gibt mir beim verschlüsseln mit RSA 0 bytes aus ? Allgemeine Java-Themen 1
vandread Daten verschlüsseln mit Java oder Datenbank Allgemeine Java-Themen 15
Bluedaishi Jar Datei Sichern bzw Verschlüsseln !!!!!! Allgemeine Java-Themen 47
C Dateien komprimieren und verschlüsseln Allgemeine Java-Themen 3
R Java Dateien "verschlüsseln" Allgemeine Java-Themen 2
T In Java String sicher verschlüsseln Allgemeine Java-Themen 6
A Texte mit .pem datei Verschlüsseln Allgemeine Java-Themen 6
D Nur Teile einer Datei symetrisch Verschlüsseln Allgemeine Java-Themen 4
F Verschlüsseln, aber welcher Algo Allgemeine Java-Themen 29
F Internet Verbindung verschlüsseln Allgemeine Java-Themen 17
I Passwort verschlüsseln Allgemeine Java-Themen 22
L Logindaten verschlüsseln Allgemeine Java-Themen 3
calzone Passwortabfrage, Verschlüsseln wie realisieren ? Allgemeine Java-Themen 3
T Datei beim schreiben verschlüsseln beim lesen entschlüsseln Allgemeine Java-Themen 11
G XML- Datei verschlüsseln Allgemeine Java-Themen 13
G Arbeitsspeicher verschlüsseln Allgemeine Java-Themen 25
R Verschlüsseln Allgemeine Java-Themen 3
J Java - ent/verschlüsseln Allgemeine Java-Themen 20
zilti Code verschlüsseln Allgemeine Java-Themen 17
H strings in datei verschlüsseln , auslesen mit klartext aber! Allgemeine Java-Themen 2
B In Java verschlüsseln - mit C# entschlüsseln Allgemeine Java-Themen 7
P JavaCode verschlüsseln / verschlüsselte Werte Allgemeine Java-Themen 3
sparrow Datenbestand verschlüsseln Allgemeine Java-Themen 3
S Datei Verschlüsseln Allgemeine Java-Themen 6
G Properties Datei verschlüsseln. WIE? Allgemeine Java-Themen 6
G class datein verschlüsseln Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben