Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

m3xx

Alter Hase

  • »m3xx« ist der Autor dieses Themas

Beiträge: 434

Beruf: Student

  • Private Nachricht senden

1

18.11.2015, 15:20

[Java] (Gelöst) Steganographie: Algorithmen auf Bit & Byte Ebene

Problem gelöst.

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »m3xx« (23.11.2015, 23:23) aus folgendem Grund: Thread-Titel geändert


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

18.11.2015, 15:28

1. Warum lieferst du das img-Array als Rückgabewert zurück? Das wäre nur dann sinnvoll, wenn die Funktion eine Kopie des Arrays erzeugen und auf dieser Kopie arbeiten würde. Sie verändert das Array aber "in-place", daher ist der Rückgabewert irreführend und unnötig.
2. Das else nach dem throw brauchst du nicht. Wenn die Exception geworfen wird, wird die Funktion automatisch verlassen.
3. Das Setzen der Bits scheint auf den ersten Blick OK zu sein. Schreib dir am besten ein paar Test-Cases, die das überprüfen.

m3xx

Alter Hase

  • »m3xx« ist der Autor dieses Themas

Beiträge: 434

Beruf: Student

  • Private Nachricht senden

3

18.11.2015, 15:36

Vielen Dank für das Feedback David :)
Das mit dem Rückgabewert ist mir jetzt ein peinlicher Fehler. Naja passiert.
Das mit der Exception wusste ich noch nicht und wird natürlich sofort angepasst.

Leider ist das mit den Testcases nicht ganz so einfach :D
Das war auch meine erste Idee, nur hab ich leider, für diesen spezifischen Fall, keine Ahnung wie ich das wirklich testen kann und sicher sein kann, dass es auch wirklich korrekt ist. :/

PS: Der Algorithmus, der das ganze Umkehrt folgt sobald er fertig ist. Würde mich über Feedback für diesen freuen, sobald er da ist :)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

18.11.2015, 15:59

Eine Idee zum Testen: Erzeuge dir jeweils ein data-Array mit rein zufälligen Daten, angefangen bei 1 Byte Größe bis meinetwegen 1 KiB Größe. Benutze deine Funktion, um die Daten in ein Bild zu schreiben und danach deine noch zu implementierende Funktion, um die Daten wieder herauszuholen. Dann vergleichst du das Herausgeholte mit dem Original und stellst sicher, dass alles gleich ist.

Noch etwas, das mir vorhin nicht aufgefallen war: Ich bin ziemlich sicher, dass data[imgIterator] falsch ist. Erstens weil dort der Offset nicht berücksichtigt wird (imgIterator - offset? - oder wie ist offset zu verstehen?), zweitens weil du von jedem Daten-Byte nur jeweils ein einziges Bit nimmst und dann schon weiter zum nächsten Daten-Byte huschst. Ich würde vorschlagen, zwei Iteratoren zu benutzen: einen für das Bild, einen für die Daten. So wie es jetzt ist, schreibst du nur das 1. Bit vom 1. Daten-Byte, nur das 2. Bit vom 2. Daten-Byte, ..., nur das 1. Bit vom 9. Daten-Byte usw.

Und noch etwas: Deine Größenabfrage (img.length < data.length + offset) ist falsch, da du hier nicht berücksichtigst, dass du zum Unterbringen von 1 Daten-Byte nicht 1, sondern 8 Bild-Bytes brauchst.

m3xx

Alter Hase

  • »m3xx« ist der Autor dieses Themas

Beiträge: 434

Beruf: Student

  • Private Nachricht senden

5

18.11.2015, 20:14

Tatsache. Das - offset gehört da noch hin. Das offset ist als Anzahl der Bytes zu verstehen, die vom Bild nicht überschrieben werden sollen, da ich zuerst die Länge der Daten am Anfang eincodiere und dann die Daten selbst. Daher muss ich erstmal bestimmen, wie viel Bytes übersprungen werden sollen. (4 Bytes, da ich da einen Integer stehen habe). Und der andere Fehler scheint auch wahr zu sein. Werde das alles mal korrigieren, sobald ich Zuhause bin und dann den Code aktualisieren. Danke auf jeden Fall schonmal dafür :thumbsup:

Edit: Hab den Code nun aktualisiert
Zusätzlich zu den Änderungen die du genannt hast David, habe ich noch die for-Schleife geändert, dadurch wird jetzt erstmal das Most Segnificant Bit zuerst and das Least Segnificant Bit zum Schluss geschrieben, da es so einfacher ist, den ganzen Kram wieder zu dekodieren

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »m3xx« (18.11.2015, 23:12)


m3xx

Alter Hase

  • »m3xx« ist der Autor dieses Themas

Beiträge: 434

Beruf: Student

  • Private Nachricht senden

6

20.11.2015, 15:44

Ausgangspost wurde aktualisiert. Dort ist jetzt auch der Code für das decoden. Außerdem ist der Code für das Encoden korrekt. (Bereits getestet, indem ich überprüft habe, welche Werte geschrieben wurden)

Werbeanzeige