Autor |
Beitrag |
battledevil
      
Beiträge: 96
WinXP, Win7
C#, C++, VBNET
|
Verfasst: Mi 07.02.07 00:37
Moderiert von raziel: 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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 735
Erhaltene Danke: 6
Windows 7
Delphi7 - Delphi XE
|
Verfasst: 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 mov ax, 3 shr ax, 1 shl ax, 1 end; |
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|
|
oldmax
      
Beiträge: 380
D3 Prof, D4 Prof
|
Verfasst: 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
_________________ Zier dich nich so, ich krieg dich schon....
|
|
battledevil 
      
Beiträge: 96
WinXP, Win7
C#, C++, VBNET
|
Verfasst: 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
      
Beiträge: 735
Erhaltene Danke: 6
Windows 7
Delphi7 - Delphi XE
|
Verfasst: Mi 07.02.07 11:23
oldmax 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
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|
|
rizla
      
Beiträge: 417
Erhaltene Danke: 2
XP
FPC mit Lazarus
|
Verfasst: Mi 07.02.07 15:42
_________________ if you have what they want - they'll find a way to take it (bruce sterling)
WOW - 10 JAHRE Mitglied beim Delphi-Forum. Wie die Zeit vergeht, Freunde.
|
|
|