Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Frage zur bitweisen Verschiebung


battledevil - Mi 07.02.07 00:37
Titel: Frage zur bitweisen Verschiebung
Moderiert von user profile iconraziel: Doppelte Themen zusammengeführt.

Hallo Leute,

Ich schreibe gerade ein kleines Steganographie-Programm. Dazu versuche ich, Buchstaben in Bits zu zerlegen, um die dann speichern zu können.
Wenn ich folgenen Code ausführe (bit ist als byte definiert), sollte ich doch eigentlich als
Ergebnis in bit das letzte Bit des ASCII-Codes des ersten Zeichens im Editfeld bekommen.


Delphi-Quelltext
1:
2:
bit:=Ord(edit1.Text[1]);
bit:= bit shl 7 shr 7;


Stattdessen steht in bit der komplette ASCII-Code des Zeichens. ich dachte, duch shl und shr würde ich die restlichen Bits eliminieren. Kann mir jemand erklären, ob ich einen Denkfehler habe oder was ich hier falsch mache ?

Danke

Nico


Narses - Mi 07.02.07 00:47

Moin!

Warum machst du nicht einfach

Delphi-Quelltext
1:
bit := Ord(edit1.Text[1]) and 1;                    

Damit kannst du dir komplett die Schieberei sparen. ;)

cu
Narses


Delete - Mi 07.02.07 01:30

wenn du 'n blick in das CPU fenster wirfst, erkennst du, was passiert:


Quelltext
1:
2:
3:
4:
5:
c := c shl 7 shr 7;
 movzx eax,bl
 shl eax,$07
 shr eax,$07
 mov ebx,eax


entweder du arbeitest auf assembler ebene, oder du nimmst den tipp von nares sehr ernst.


HelgeLange - Mi 07.02.07 03:17

Du willst die einzelnen bit ? warum shiftest du dann ? gibt doch den test befehl in asm... dann weisst du, ob ein bit gesetzt ist oder nicht. das Gegenstück in pascal wäre der AND-test : If bit AND 1=1 then... Da musst du nix rumshiften.
Und wenn du wissen willst, ob 7 bits links shiften und dann 7 bits rechts schiften genau macht, dann nimm mal das cpu-fenster, hau dir in dein edit feld eine 3 rein und schau dir an, was im register steht, welches die 3 hat.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
asm
  xor eax, eax // register löschen : EAX = 0000000
  mov ax, 3    // EAX = 0000003 (bit 0 + 1 gesetzt)
  shr ax, 1    // EAX = 0000001 (bit 0 gesetzt)
  shl ax, 1    // EAX = 0000002 (bit 1 gesetzt)
end;


oldmax - Mi 07.02.07 07:43

Hi
Also, wenn du einen Registerwert zuerst nach links schiebst, dann solltest du wissen, das du nicht ein Byte, sondern mindestens ein Word schiebst. Helge hat durchaus recht, shiften sollte man nur, wenn die Notwendigkeit besteht...
hier reicht eine Abfrage per Test.
Helge, dein Programm macht leider etwas anderes, als du behauptest...
du shiftest zuerst nach rechts, und dann nach links. Da ist klar, das Bit 0 verschwindet. Vielleicht sollte noch erwähnt werden, ein Register ist mittlerweile nicht mehr 8 Bit breit, 32 und mehr sind Standart und da sollte man schon wissen, über welche Breite der Befehl wirkt.
Ein Wort noch zur Variablenbezeichnung: Also Bit für ein Byte halte ich genauso ungeeignet wie Fliesskomma für Integer.....
CheckByte oder RefByte wären da etwas eher angebracht, aber des Menschen Willi ... oder so
Gruß oldmax


battledevil - Mi 07.02.07 10:05

Ok, vielen Dank für die ganzen Antworten.
Ich hab deshalb geshiftet, weil ich ja im Endeffekt alle Bits brauche, nur eben einzeln und so nur die Weite der Verschiebung variieren muß, um an ein bestimmtes Bit zu kommen.
Ich werde das jetzt durch die AND-Tests ersetzen.


HelgeLange - Mi 07.02.07 11:23

user profile iconoldmax hat folgendes geschrieben:
Hi
Helge, dein Programm macht leider etwas anderes, als du behauptest...
du shiftest zuerst nach rechts, und dann nach links. Da ist klar, das Bit 0 verschwindet. Vielleicht sollte noch erwähnt werden, ein Register ist mittlerweile nicht mehr 8 Bit breit, 32 und mehr sind Standart und da sollte man schon wissen, über welche Breite der Befehl wirkt.


Ich habe absichtlich so geschoben, die Erklärungen im Code sind richtig, ich wollte ihm aufzeigen, dass das bit verschwindet, da er in seinem unsprünglichen Code 7 links, dann rechts schiebt


rizla - Mi 07.02.07 15:42

Kuckst du hier:
http://www.dsdt.info/tutorials/steganographie/