Autor Beitrag
battledevil
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP, Win7
C#, C++, VBNET
BeitragVerfasst: Mi 07.02.07 00:37 
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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 07.02.07 00:47 
Moin!

Warum machst du nicht einfach
ausblenden 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



BeitragVerfasst: Mi 07.02.07 01:30 
wenn du 'n blick in das CPU fenster wirfst, erkennst du, was passiert:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: 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.

ausblenden 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;

_________________
"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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 380


D3 Prof, D4 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP, Win7
C#, C++, VBNET
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: 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

_________________
"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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 417
Erhaltene Danke: 2

XP
FPC mit Lazarus
BeitragVerfasst: 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.