Entwickler-Ecke
Sonstiges (Delphi) - Simulation von Bitfehlern
greno - Sa 16.05.09 20:33
Titel: Simulation von Bitfehlern
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 - 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.
greno - 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 ? :P
greno - 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
Delete - 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 - 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 :D
dankeschön
Marc. - 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
Delete - 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 - 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?
Delete - 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 - 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. - So 17.05.09 14:42
greno hat folgendes geschrieben : |
| aber stimmt das, dass man nur das bit ganz rechts, das LSB ausgeben kann? |
Du könntest auch mit dem hochwertigsten Bit beginnen oder mittendrin. Nur ist die Frage, ob das Sinn macht. ;)
greno - 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. - 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. :nixweiss:
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 - So 17.05.09 15:50
ja ich hab irgendwo da eine denkblockade
Delphi-Quelltext
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 :P) 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. - 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; |
Delete - 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 - So 17.05.09 16:02
danke marc so hab ich das auch versucht ist mir aber nicht gelungen irgendwie :oops: 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 :D
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!