Wie 4 Bit speichern?

Status
Nicht offen für weitere Antworten.

PHANTOMIAS

Aktives Mitglied
Hallo an alle!

Ich habe eine grundlegende Frage und ich bin mir nicht sicher was der beste Weg dafür wäre:

Ich brauche eine Eingabemöglichkeit von 16 bit, bpsw.
1100001010101110

Und dies möchte ich gerne speichern und in 4 Blöcke aufteilen, da ich bspw. drehen muss. Also habe ich in diesem Fall:
a1 = 1100
a2 = 0010
a3 = 1010
a4 = 1110

Da muss ich z.B. a3 und a4 drehen zu
b1 = 1100
b2 = 0010
b3 = 1110
b4 = 1010

und dann muss auch getauscht werden, wobei folgende Zuweisung (die ist vorgegeben) herrscht:

x = 0001 => y = 1100
x = 0010 => y = 0101
...
x = 1010 => y = 1111
...
x = 1110 => y = 0010

Also habe ich dann:
c1 = 1100
c2 = 0010
c3 = 0010
c4 = 1111

In welchem Format kann ich am Besten speichern um das am Besten umsetzen zu können? Wenn es 8 Bit wären, würde ich ja ein 2*2 Byte Array nehmen. Aber so? Was wäre geeignet?

Hintergrund ist die grundlegende Umsetzung eines symmetrischer Blockcodierung (Kryptografie).

Gruß PHANTOMIAS
 

PHANTOMIAS

Aktives Mitglied
Oh, das sieht ja gut aus mit dem BitSet. Vielen Dank, das kannte ich bisher gar nicht.

Kann ich über die Konsole gleich in ein BitSet einlesen?

Und ist es geschickter dann 4 BitSets mit je 4 Bit zu nehmen oder eins mit 16 Bit?

Gruß PHANTOMIAS
 

Wildcard

Top Contributor
Kann ich über die Konsole gleich in ein BitSet einlesen?
Das ist trivial. String einlesen, mit einer Schleife über das char[] iterieren und die Bits entsprechend setzen.

Und ist es geschickter dann 4 BitSets mit je 4 Bit zu nehmen oder eins mit 16 Bit?
Ich kann dir nicht sagen was besser zu deiner Applikation passt. Nimmt sich IMO nicht so viel...
Falls das bestimmte feste Transformationsregeln sind die du häufiger aufrufst bietet sich eine eigene Klasse an die intern ein BitSet verwendet, oder auch von BitSet erbt.
Dann kannst du direkt passende Methoden auf dem Objekt bereitstellen.
 

Marco13

Top Contributor
Je nachdem, ob da Effizienz eine Rolle spielt... Wenn man z.B. das 4.-8. bit aus einen BitSet holen will, und/oder damit diese vorgegebene "Zuweisung" berechnen und durchführen will, kann das auch ziemlich ... hakelig (und im Vergleich zu einem int, wo man das mit einem OR und einen Shift machen kann, auch ineffizient) werden. Ggf. könntest du auch in Erwägung ziehen, das auf ints zu machen, und für "haufig" verwendete Zugriffsmuster kleine utility-Methoden zu basteln, sowas wie
Code:
int get(int n, int minBit)
{
    return (n >> minBit) & 0xF;
}
int set(int n, int b, int minBit)
{
    return n | (b << minBit);
}
...
// Angedeutete "Zuweisung" für das 4.-8. bit von 'input'...
int result = set(input, patterns[get(input, 4)], 4);
Aber das musst du dir überlegen.
 

Wildcard

Top Contributor
Richtig, int ist wie gesagt auch eine Möglichkeit. Besonders wenn du shiften musst bietet sich das an. Beim Speicher nimmt es sich allerdings nicht sehr viel (wenn man nicht gerade sehr viele, kleine BitSets verwendet), denn BitSets sind sehr Speichereffizient implementiert. Kein Vergleich zu einem boolean[].
 

PHANTOMIAS

Aktives Mitglied
Aber mit BigInteger oder BitSet hätte ich schon eine fertige xor-Methode im Gegensatz zu int bzw. Integer.
Es geht um eine eigene Umsetzung von AES in einer abgewandelten Variante.
 

Wildcard

Top Contributor
Und mit beiden kannst du nicht shiften. Wenn du nicht shiften musst, nimm BitSet, wenn doch, schreib dir eine eigene Klasse die alle benötigten Methoden für einen int bereitstellt.

Edit:
Es geht um eine eigene Umsetzung von AES in einer abgewandelten Variante.
Aber ich hoffe nur zu Übungs- und Demonstrationszwecken :)
 
Zuletzt bearbeitet:

PHANTOMIAS

Aktives Mitglied
Aber es gibt doch die Methoden shiftLeft und shiftRight bei BigInteger, siehe (BigInteger (Java 2 Platform SE v1.4.2)).

Shiften muss ich, soweit ich das bisher beurteilen kann, nicht. Immer nur xor oder das 2*2 Array tauschen bzw. ein Element des Arrays substituieren. Ich denke zur Zeit, dass BigInteger am Besten ist. Wenn ich den richtigen AES draufsetze, so kriege ich wenn ich alles aufnehme ja bis zu 256 Bit. Und da klappt int ja nicht mehr.
 

Wildcard

Top Contributor
Aber es gibt doch die Methoden shiftLeft und shiftRight bei BigInteger
ok, stimmt, habe ich vergessen.

Ich denke zur Zeit, dass BigInteger am Besten ist. Wenn ich den richtigen AES draufsetze, so kriege ich wenn ich alles aufnehme ja bis zu 256 Bit. Und da klappt int ja nicht mehr.
Du musst wissen was du tust. Der Overhead wird speziell für kleine bit Mengen wesentlich größer.
Speicherverbrauch:
int < BitSet < BigInteger
 

PHANTOMIAS

Aktives Mitglied
Also irgendwie glücklich bin ich mit keiner Variante. Mit BigInteger hatte ich Probleme, wie ich aus dem String das in die BigInteger Variable bekomme, bei BitSet sehe ich auch keine andere Möglichkeit als das so zu machen, wobei die Ausgabe mit das liefert:
{0, 2} - {5, 6, 7} - {10, 11} - {12, 14, 15}

Java:
		BitSet key[] = new BitSet[4];
		key[0] = new BitSet(4);
		key[1] = new BitSet(4);
		key[2] = new BitSet(4);
		key[3] = new BitSet(4);
		
		for (int i=0; i < 4; i++) {
			if (k.charAt(i) == '1') {
				key[0].set(i);
			}
		}
		for (int i=4; i < 8; i++) {
			if (k.charAt(i) == '1') {
				key[1].set(i);
			}
		}
		for (int i=8; i < 12; i++) {
			if (k.charAt(i) == '1') {
				key[2].set(i);
			}
		}
		for (int i=12; i < 16; i++) {
			if (k.charAt(i) == '1') {
				key[3].set(i);
			}
		}
		System.out.println(key[0]+" - "+key[1]+" - "+key[2]+" - "+key[3]);

Wenn ich mir die Dokumente duchlesen, dann ist wohl sogar BigInteger allgemein gefordert zu verwenden. Ob das sinnvoll ist, sei dahingestellt.

Aber wie kann ich mit BigInteger das handlen, dass ich den String in die Stücke schneide und das in BigInteger hineingebe und wieder zum Schluss in der Form 1100 rausgebe bzw. gesamt, bspw.: 1100010111100010.

Gruß PHANTOMIAS
 

Marco13

Top Contributor
Kurze Antwort: Mit viel (einfachem aber ineffizientem) String-Gewurschtel... Für eine Verschlüsselung würde sich IMHO eher (schwierigers aber effizientes) Bit-Gewurschtel anbieten. Beschreib' aber nochma genauer, was du vorhast: An welcher Stelle der Verschlüsselung sollen tatsächlich Bit-Strings ausgegeben werden? Normalerweise hat man ja nur die Umwandlung Klartext->Schlüsseltext (und ggf. umgekehrt) - als "Anwender" sieht man die Bits da nirgends. Wenn die Bit-Ausgaben nur für Debugging & Co sind, ist das IMHO eigentlich kein Grund, sein Programm genau DArauf auszurichten...
 

PHANTOMIAS

Aktives Mitglied
Okay, danke füe die Antwort.

Ich hole doch etwas weiter aus: Diese Implementierung von AES wird im ersten Schritt in einer abgewandelten einfacheren Form umgesetzt.
Was hierbei gemacht wird, zeigt wikipedia recht gut:
Advanced Encryption Standard ? Wikipedia

Diese Implementierung dient zum Üben der Umsetzung von solchen Algorithmen im Sicherheits-Bereich. Diese Bit-Ausgaben sollen nach jedem Schritt erscheinen.

Klar: Im Normalfall sieht man die nirgends, man gibt Text und Schlüssel rein und der verschlüsselte Text kommt raus. Aber es geht um Demo-Zwecke und da sollen die einzelnen Schritte auf der Konsole ausgegeben werden mit Resultat wie zu diesem Zeitpunkt (nach dem jeweiligen Schritt) das Bitmuster aussieht.

Im Normalfall wird bei AES mit Bytes (8 Bit) hantiert. In der einfachen Form nur mit je 4 Bits. Und diese 4*4 Bits werden getauscht, substituiert, xor verknüpft.
Also ist es sinnvoll die 4 Bits je in einer einzelnen Variable bzw. in einem 2x2 Array zu speichern.

Ich muss also auf der einen Seite mit den je 4 Bits-Variablen hantieren können, also auch die Kontrollausgaben von 2*4 oder aller, also 4*4 Bits, erzeugen können.

Gruß PHANTOMIAS
 

Marco13

Top Contributor
OK, wenn du mit einem BigInteger rumhantierst wirst du das vermutlich mit den Methoden machen:

BigInteger(String val, int radix) : Konstruktor, mit dem man mit
x = new BigInteger("1001001", 2);
einen BigInteger aus einem Binärstring machen kann.

BigInteger#toString(int radix) : Methode mit der man mit
String s = bigInteger.toString(2);
einen BigInteger in einen Binärstring umwandelt

String#substring(...) : Methode mit der man die 4-Zeichen-Päckchen aus einen String rausholen kann.

Etwas lästig könnte es noch werden, dass man ggf. "padden" muss, d.h. wenn man z.B. die Zahl "5" binär ausgibt, erhält man "101", obwohl man lieber ein 4er-Päckchen der Form "0101" hätte.... Dafür kann man sich aber auch eine Hilfsmethode basteln.
 

PHANTOMIAS

Aktives Mitglied
Vielen Dank für die schnelle Antwort.

Ich habe es mal so eingebaut:
Java:
	private BigInteger k[][];
...
k = new BigInteger[2][2];
		k[0][0] = new BigInteger(schluessel.substring(0, 4), 2);
		k[0][1] = new BigInteger(schluessel.substring(4, 8), 2);
		k[1][0] = new BigInteger(schluessel.substring(8, 12), 2);
		k[1][1] = new BigInteger(schluessel.substring(12, 16), 2);
So haut es hin. Ja, und die Ausgabe, die lässt die führende Null weg. Aber da kann man padden, das wird schon hinhauen.

Gruß PHANTOMIAS
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
hennskand Brauche Hilfe Zwischenzustände von Objekt aus rekursiver Methode speichern Java Basics - Anfänger-Themen 6
M Länge eines Arrays als Variable speichern möglich? Java Basics - Anfänger-Themen 14
R Liste in Variable speichern Java Basics - Anfänger-Themen 6
onlyxlia Anzahl Random Zahlen mit Scanner abfragen und in Array speichern Java Basics - Anfänger-Themen 10
G JTree speichern und wieder einlesen Java Basics - Anfänger-Themen 5
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
P Wie kann ich beispielsweise Speicherstände eines Spiels DAUERHAFT in meinem Programm speichern? Java Basics - Anfänger-Themen 3
J Objekte in JSON speichern?? Java Basics - Anfänger-Themen 1
A Daten aus einer HashMap aus einer DB speichern und mit neuen Werten vergleichen Java Basics - Anfänger-Themen 8
I Bild richtig speichern / Hochkant im File Explorer, nach Upload vertikal Java Basics - Anfänger-Themen 9
I Objekte in ShareProject speichern um später zu nutzen Java Basics - Anfänger-Themen 4
I Passwort in Datenbank speichern um später wieder auszulesen Java Basics - Anfänger-Themen 5
S mehrere TreeSets so speichern, dass man sie miteinander vergleichen kann Java Basics - Anfänger-Themen 1
I Datei (Bild) Drucken und wie Druckeinstellung speichern? Java Basics - Anfänger-Themen 3
I H2 Datenbank starten / Daten in File speichern Java Basics - Anfänger-Themen 25
M Werte in Felder speichern und geordnet ausgeben Java Basics - Anfänger-Themen 8
A CSv.Datei einlesen und die werte in zweidemosional Int Array speichern Java Basics - Anfänger-Themen 9
L Dauerhaftes Speichern einer Eingabe bei einer ArrayList Java Basics - Anfänger-Themen 26
S Eine Variable in einem Array speichern Java Basics - Anfänger-Themen 5
T Permanentes speichern von Objekten in einer ArrayList Java Basics - Anfänger-Themen 6
M Mehrere Daten/ Variablen Speichern Java Basics - Anfänger-Themen 9
berserkerdq2 Ich gebe eine ArrayList als List zurück per MEthode, wie kann ich nun aber die ArrayList speichern? Java Basics - Anfänger-Themen 46
I Historisierung - Alter Wert, Neuer Wert... wie speichern? Java Basics - Anfänger-Themen 44
berserkerdq2 Wie datum im default format speichern? Java Basics - Anfänger-Themen 5
M Objekt in einem Objekt speichern Java Basics - Anfänger-Themen 9
J Speichern von zwei Variablen durch Auslesen aus einem Numberfield Java Basics - Anfänger-Themen 2
f3mys Objektwerte in Liste speichern und wieder abrufen Java Basics - Anfänger-Themen 23
I Liste von Infos von einer eigenen Annotation in Liste speichern Java Basics - Anfänger-Themen 0
U Wie ein Attribut von einer Klassenmethode in der Klasse speichern= Java Basics - Anfänger-Themen 2
B Screenshots machen und zwar viele und speichern Java Basics - Anfänger-Themen 12
C XML Datei speichern und laden Java Basics - Anfänger-Themen 18
Marlena Bauer Konsolenausgabe in .txt speichern Java Basics - Anfänger-Themen 6
B JaxB - Property vom Typ Object und LocalDateTime speichern? Java Basics - Anfänger-Themen 0
ansystin Teilerfremde Zahlen ausgeben + Zahlenausgabe speichern Java Basics - Anfänger-Themen 3
J Wert in einer json Datei ändern und speichern Java Basics - Anfänger-Themen 3
C File speichern Java Basics - Anfänger-Themen 5
D String und char in String speichern Java Basics - Anfänger-Themen 5
J Alle .java Dateien von einem Verzeichnis in eine Zip speichern Java Basics - Anfänger-Themen 2
I Werte (u.a. Geldbeträge) in Datenbank speichern und Rundungen? Java Basics - Anfänger-Themen 8
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
H Daten aus einer Datei in eine Liste speichern Java Basics - Anfänger-Themen 23
B JaxB - speichern vom Typ "Object" Java Basics - Anfänger-Themen 8
GermanPie Nachrichten Speichern Java Basics - Anfänger-Themen 2
M Objekte in Array speichern und ausgeben Java Basics - Anfänger-Themen 17
C Wo Defaultpfad speichern? Java Basics - Anfänger-Themen 2
M Integer aus aus einer Klasse in andere speichern Java Basics - Anfänger-Themen 12
Dimax stream in string[] speichern Java Basics - Anfänger-Themen 6
H Liste speichern. Was lässt sich verbessern? Java Basics - Anfänger-Themen 7
C Fehler beim Speichern (Build projekt) Java Basics - Anfänger-Themen 42
J Ich brauche Hilfe bei einem Code (Variablen speichern) Java Basics - Anfänger-Themen 29
C Verschiedene Objekte in einer Liste speichern Java Basics - Anfänger-Themen 6
D Input/Output Input von zwei Koordinaten validieren und anschließend Werte speichern Java Basics - Anfänger-Themen 7
N Speichern von Werten in Variablen nach Schließen des Programms Java Basics - Anfänger-Themen 3
G Problem beim Speichern von Objekten in einer Datei Java Basics - Anfänger-Themen 7
I ArrayList - Methode zum Speichern eines Eintrags in einer Datei Java Basics - Anfänger-Themen 17
H Objekt im Array speichern Java Basics - Anfänger-Themen 2
H Objekt als Attribut speichern Java Basics - Anfänger-Themen 11
B Text-Datei nur in Stream speichern und dann ausgeben Java Basics - Anfänger-Themen 3
M JTextField in ArrayList speichern Java Basics - Anfänger-Themen 4
L Nur Bestimmte Werte aus einem Array in ein anderes Speichern Java Basics - Anfänger-Themen 11
S Zweidimensionales Array in ein eindimensionales Array speichern Java Basics - Anfänger-Themen 6
A Wie zwei zahlen in einer Variable speichern? Java Basics - Anfänger-Themen 7
C ResultSet in Array speichern Java Basics - Anfänger-Themen 5
S Byte-Array kann chars speichern? Java Basics - Anfänger-Themen 3
J Kann man files in einer Klasse speichern. Java Basics - Anfänger-Themen 2
B Infos zu Attribute in einer Klasse speichern Java Basics - Anfänger-Themen 3
M Input/Output JTextField Eingabe in String Variable speichern Java Basics - Anfänger-Themen 15
A Kann man eine Methode als Variable speichern und danach noch verändern? Java Basics - Anfänger-Themen 6
D Werte aus einem BinärBaum in einem Array speichern Java Basics - Anfänger-Themen 1
I Datei in Programm speichern Java Basics - Anfänger-Themen 3
A .txt-Datei mit Java speichern Java Basics - Anfänger-Themen 2
M Speichern unter. Java Basics - Anfänger-Themen 11
S Java Daten in Excel speichern Java Basics - Anfänger-Themen 1
S Daten speichern, ohne Datenbank Java Basics - Anfänger-Themen 8
L Objekt aus Textdatei in ArrayList speichern Java Basics - Anfänger-Themen 4
L Kommandozeileneinträge in Array speichern Java Basics - Anfänger-Themen 4
B HTML Code in XML speichern Java Basics - Anfänger-Themen 3
G Benutzereingaben durch Zeilenumbruch trennen und in Array individueller Größe speichern Java Basics - Anfänger-Themen 20
G JTextField per Button speichern und an andere Klasse übergeben Java Basics - Anfänger-Themen 2
Shallty Daten speichern und ändern? Java Basics - Anfänger-Themen 32
R Objekte aus Array als String + kommasepariert speichern Java Basics - Anfänger-Themen 12
N Best Practice Rückgabe eines Terminal Befehls in eine Variable speichern Java Basics - Anfänger-Themen 27
B XML in DB speichern -> Regelkonzept Java Basics - Anfänger-Themen 2
T Daten von Objekten speichern Java Basics - Anfänger-Themen 7
A Einträge aus Tupeln nach Regeln in Liste speichern Java Basics - Anfänger-Themen 8
void19 Methoden Binärbaum Inorder Traversierung in Array speichern Java Basics - Anfänger-Themen 1
X TextField-Inhalt mit Button in .txt-Datei speichern Java Basics - Anfänger-Themen 16
C Methoden Problem beim Speichern von Variablen Java Basics - Anfänger-Themen 1
J Geld speichern und wieder auslesen Java Basics - Anfänger-Themen 10
K Geburtsdaten von Mehreren Personen speichern und Alter ausgeben Java Basics - Anfänger-Themen 11
F Beste Datenstruktur zum Speichern? Java Basics - Anfänger-Themen 1
Dimax Programme ,als Text in MySql speichern Java Basics - Anfänger-Themen 7
C Erste Schritte ArrayIndexOutOfBoundsException beim Speichern im Array Java Basics - Anfänger-Themen 2
D Datei auslesen & Werte in Variable speichern Java Basics - Anfänger-Themen 12
D Erste Schritte Projekt in Ecplise in einer .zip Datei speichern Java Basics - Anfänger-Themen 8
L Speichern und Laden Java Basics - Anfänger-Themen 7
I Projekt als .jar Datei speichern - Bilder werden nicht mehr angezeigt Java Basics - Anfänger-Themen 4
H MouseListener begrenzen und Speichern Java Basics - Anfänger-Themen 1
M Wie kann ich im JAVA-GUI im Textfeld ein Array speichern Java Basics - Anfänger-Themen 4
N Veränderungen dauerhaft speichern Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben