| Autor |
Beitrag |
greno
Hält's aus hier
Beiträge: 9
|
Verfasst: Sa 16.05.09 20:33
Hey Leute,
ich habe ein riesiges Problem und weiß echt net weiter:
Ich möchte ein einfaches Programm schreiben, mit dem ich Bitfehler simulieren kann, die in einem Byte auftreten,dh. ich erzeuge ein zufälliges Byte zB. 10010110, dieses wird dann "übertragen" und ein oder mehrere Bits werden gekippt zB. 10110010.
Ich bin so an die Sache gegangen, dass ich den Byte in einen String schreiben lasse, weil ich mir nicht anders zu helfen wusste...
Nun habe ich für jedes Bit eine gleiche Wahrscheinlichkeit p, die bestimmt, ob das Bit kippt.
Das ist alles kein Problem. Das Konzept ist vllt etwas umständlich aber nachvollziehbar, oder?
Nun kann ich jedes Bit mit einer for-to Schleife rausziehen und wenn die Wahrscheinlichkeit eintritt(mache ich mit random) möchte ich das Bit kippen. Das habe ich mir so überlegt:
Neues Bit:=ABS(Altes Bit-1)
Char und Integer ist aber nicht kompatibel und anders kriege ich es auch nicht hin was würdet ihr vorschlagen, wie diese Aufgabe zu lösen ist?
Danke schonmal 
|
|
jakobwenzel
      
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: Sa 16.05.09 20:39
Bitweise Operatoren sind dein Freund - in deinem Fall xor.
Ein einzelnes Byte mit nur einem gesetzten Bit kannst du mit 1 shl <Nummer des Bits> erzeugen.
_________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
|
|
greno 
Hält's aus hier
Beiträge: 9
|
Verfasst: Sa 16.05.09 21:17
Mit sowas hab ich mich noch nicht auseinandergesetzt... Also bitte ganz von vorne, in welchem format muss das alles sein etc. (string oder int) ich blick da echt nicht durch ist auch irgendwie peinlich dass ich von bitweisen Operatoren keine große Ahnung habe.
Wäre wirklich dankbar wenn mich jemand da ein bisschen ranführen kann.
Danke
ps:wie kann ich das byte dann anzeigen das ist auch ein problem... bytetostring ? 
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 16.05.09 21:32
|
|
greno 
Hält's aus hier
Beiträge: 9
|
Verfasst: Sa 16.05.09 21:37
vielen vielen dank, heute habe ich aber keine lust mehr mir das anzutun
deswegen werde ich mich morgen nochmal dransetzen.
MFG
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 16.05.09 21:45
Kein Problem. Wenn Du das begriffen hast, kannst Du Dir dann auch relativ leicht selbst eine Funktion schreiben, die Dir aus einer Zahl eine binäre Stringdarstellung erstellt.
|
|
greno 
Hält's aus hier
Beiträge: 9
|
Verfasst: So 17.05.09 12:32
hallo miteinander,
vielen dank nochmal für die schnelle hilfe.
ich habe glaube ich die problematik soweit verstanden jetzt und auch wie man mit diesen flags rechnen kann.. nur mein problem ist jetzt wie man das anschaulich macht also irgendwie anzeigt.
ich krieg das byte halt nicht in ein label oder editfeld, was das wichtigste an meinem projekt wäre.
tut mir leid wenn ich mich ein bischen doof anstelle,bin aber nie über int,real,string und ganz wenig boolean hinausgegangen, grundkurs eben.
wenn ich den ansatz erstmal habe, werde ich euch nicht mehr mit solchen fragen belästigen, versprochen
dankeschön
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: So 17.05.09 12:49
greno hat folgendes geschrieben : | ich habe glaube ich die problematik soweit verstanden jetzt und auch wie man mit diesen flags rechnen kann.. nur mein problem ist jetzt wie man das anschaulich macht also irgendwie anzeigt.
ich krieg das byte halt nicht in ein label oder editfeld, was das wichtigste an meinem projekt wäre. |
Es gibt diverse Funktionen, um ein Byte in einen String umzuwandeln.
Hier ein Beispiel:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| function IntToBin(Int: Integer): String; var i : Integer; begin Result := ''; for i := 7 downto 0 do Result := Result + IntToStr((Int shr i) and 1); end; |
Diese Funktion prüft alle Byte-Indizes (von 7 bis 0) auf 0 oder 1. Dafür wird das Byte jeweils um den entsprechenden Index nach Rechts geshiftet. Das zu prüfende Bit steht damit ganz rechts und kann nun mittels and 1 "geprüft" werden.
Grüße,
Marc
Zuletzt bearbeitet von Marc. am So 17.05.09 12:52, insgesamt 1-mal bearbeitet
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 17.05.09 12:50
Hier eine von vielen Implementierungen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function IntToBinaryString(Number: integer): string; const BitChars: array[Boolean] of char = ('0','1'); var i, CurrentBit: integer; begin SetLength(Result,SizeOf(integer) shl 3); CurrentBit := 1 shl Pred(SizeOf(integer) shl 3); for i := 1 to Length(Result) do begin Result[i] := BitChars[(Number and CurrentBit) = CurrentBit]; CurrentBit := CurrentBit shr 1; end; end; |
|
|
greno 
Hält's aus hier
Beiträge: 9
|
Verfasst: So 17.05.09 12:53
okay. ich hatte eben eine ähnliche idee, dass man dem byte erstmal einen zufälligen wert gibt und dann das byte bitweise von rechts nach links abfragt ob an dem bestimmten bit eine 1 oder 0 steht, das dann in einem string speichert und diesen ausgibt. kann man eine solche abfrage machen?
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 17.05.09 12:56
Schau Dir beide Beispiele einmal ganz genau an, dann sollte Dir das Prinzip bekannt vorkommen (gut, ich gehe die Zahl von links nach rechts durch, aber prinzipiell macht das keinen großen Unterschied).
|
|
greno 
Hält's aus hier
Beiträge: 9
|
Verfasst: So 17.05.09 13:17
also ich blick durch die erste function besser durch, vielen dank euch beiden, ich glaube ich habe das jetzt soweit verstanden also mal ein beispiel:
ich habe die int-zahl 6 oder binär 00000110.
so, wenn ich jetzt 6 shr 2 mache, wird das zweite bit von rechts(?!?) nach ganz rechts verschoben: (00000101) falsch
und man kann nur das bit ganz rechts ausgeben...
wenn ich das so schreibe merke ich, dass ich doch noch nicht so viel verstanden habe...
edit: also mir ist jetzt klar, dass ALLE bits um shr (stellen) nach rechts verschoben werden. aber stimmt das, dass man nur das bit ganz rechts, das LSB ausgeben kann?
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: So 17.05.09 14:42
|
|
greno 
Hält's aus hier
Beiträge: 9
|
Verfasst: So 17.05.09 15:32
naja ich hab mich ein bischen durchgekämpft ich werde das resultat mal posten nachher,
vielen dank für eure hilfe, ohne euch wäre das echt nix geworden.
--- Moderiert von Narses: Beiträge zusammengefasst---
also ich hab jetzt ein echtes problem und krieg gleich nen nervenzusammenbruch:
warum kann ich damit mein erzeugtes byte nicht invertieren (das byte ist das integer a):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.Button2Click(Sender: TObject); begin s:=''; for z:=7 downto 0 do begin if (a shr z)=0 then s:=s+IntTostr((a shr z) or 1) else s:=s+inttostr((a shr z) and 0); end; form1.edit2.text:=s; end; |
man zieht die bits ganz nach rechts, wenn es 0 ist dann wird es durch or 1 zu einer 0, wenn es 1 ist wird es durch and 0 zu einer 0...
warum geht das nicht wo ist der fehler?
Moderiert von Narses: Delphi-Tags hinzugefügt
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: So 17.05.09 15:38
greno hat folgendes geschrieben : | man zieht die bits ganz nach rechts, wenn es 0 ist dann wird es durch or 1 zu einer 0, wenn es 1 ist wird es durch and 0 zu einer 0...
warum geht das nicht wo ist der fehler? |
or 1 wird immer 1! Zudem versteh ich die Logik deiner IF-Abfrage nicht.
Wie genau sollte das funktionieren?
Edit: Wenn du es schon mit einer IF-Abfrage machen willst, dann so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| function IntToBin2(ANum: Integer): String; var i: Integer; begin result := ''; for i := 7 downto 0 do begin if (ANum shr i) = 0 then result := result + '0' else result := result + inttostr((ANum shr i) and 1); end; end; |
PS: Bitte benutz für deinen Code die Delphi-Tags [delphi] [/delphi ]
|
|
greno 
Hält's aus hier
Beiträge: 9
|
Verfasst: So 17.05.09 15:50
ja ich hab irgendwo da eine denkblockade
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| var Form1: TForm1; a,z: integer; s:string;
implementation
function IntToBin(Int: Integer): String; var i : Integer; begin Result := ''; for i := 7 downto 0 do Result := Result + IntToStr((Int shr i) and 1); end;
procedure TForm1.Button1Click(Sender: TObject); begin a:=random(256); edit1.text:=inttobin(a); end;
procedure TForm1.Button2Click(Sender: TObject); begin s:=''; for z:=7 downto 0 do begin if (a shr z)=0 then s:=s+IntTostr((a shr z) or 1) else s:=s+inttostr((a shr z) and 0); end; form1.edit2.text:=s; end; |
das mit der if abfrage soll heissen:
wenn der abgefragte bit den wert 0 hat dann wird er nun im inverteierten byte eine 1,
wenn der abgefragte bit keine 0 ist (also eine 1  ) dann wird er durch and 0 eine 0... aber das geht so nicht, ich bin mir glaube ich auch noch zu unsicher was a shr z jetzt genau heisst...
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: So 17.05.09 15:56
Pardon, nun hab ich es verstanden.
Es reicht doch mein erstes Beispiel ein klein wenig zu modifizieren:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| function IntToBin(Int: Integer): String; var i : Integer; begin Result := ''; for i := 7 downto 0 do Result := Result + IntToStr(not (Int shr i) and 1); end; |
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 17.05.09 15:57
Vermutlich suchst Du xor. shr verschiebt die Zahl um x stellen nach rechts.
Quelltext 1: 2: 3: 4:
| 5 shr 2 00000101 //5 //Verschiebung um 2 Stellen nach rechts ergibt 00000001 //1 |
|
|
greno 
Hält's aus hier
Beiträge: 9
|
Verfasst: So 17.05.09 16:02
danke marc so hab ich das auch versucht ist mir aber nicht gelungen irgendwie  das schau ich mir nochmal genauer an.
danke deddy, hab mir das auch gedacht, wurde aber von misserfolg zu misserfolg immer unsicherer ^^
--- Moderiert von Narses: Beiträge zusammengefasst---
So habs endlich hingekriegt, für so ein miniprogramm 4 stunden vorm pc gehockt aber glaube ich habs jetzt gerafft
Vielen Dank nochmal, ich meld mich bestimmt spätestens morgen für das nächste Problem, ich hab da schon eine Vorahnung wo ich nicht weiter kommen werde.
|
|