Weller
Anmeldungsdatum: 10. Januar 2007
Beiträge: 104
Wohnort: Gebhardshain
|
Hallo.
Ich experimentiere im Moment damit, einen Datenstrom per openssl abzusichern.
Dazu nutze zum Test eine Pipeline: rec -t raw -r 8000 -e
signed-integer -b 16 -|openssl enc -rc4 -k Test -nosalt
|./fec_enc - -|ZZZZZZZZZZ|./fec_dec - -|openssl
enc -rc4 -d -k Test -nosalt|play -t raw -r 8000 -e
signed-integer -b 16 - Jetzt würde ich gerne für ZZZZZZZZ einen Befehl einsetzen um im Datenstrom Packet loss und Bitfehlerrate zu verändern... Habt ihr einen Tip? Danke & Gruß,
Andreas
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Erstmal: benutz doch bitte einen {{{ Codeblock }}}, damit man Dein Listing überhaupt gescheit lesen kann ! Dann: in der Pipe werden die Daten ja nicht als Pakete, sondern als ein kontinuierlicher Datenstrom behandelt. Den kannst Du natürlich mit sed , awk oder jedem anderen Programm "bemurksen", um Fehler zu erzeugen. (aber natürlich nicht paketweise, sondern zeilen- / zeichenweise !) Konkret müsstest Du dafür mal verraten, wie der Datenstrom genau verändert werden soll. LG, track
|
Weller
(Themenstarter)
Anmeldungsdatum: 10. Januar 2007
Beiträge: 104
Wohnort: Gebhardshain
|
track schrieb: Dann: in der Pipe werden die Daten ja nicht als Pakete, sondern als ein kontinuierlicher Datenstrom behandelt. Den kannst Du natürlich mit sed , awk oder jedem anderen Programm "bemurksen", um Fehler zu erzeugen. (aber natürlich nicht paketweise, sondern zeilen- / zeichenweise !) Konkret müsstest Du dafür mal verraten, wie der Datenstrom genau verändert werden soll.
Hallo und danke für die Antwort. Für den Anfang wären zwei Dinge nicht schlecht: - Wie ließe sich denn z.B. 2% des Datenstroms mit Zufallswerten ersetzen? - Nicht nur ersetzen - sondern auch zusätzliche Zeichen einfügen oder auch löschen? Gruß,
Andreas
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
Weller schrieb:
- Wie ließe sich denn z.B. 2% des Datenstroms mit Zufallswerten ersetzen?
Dies Programm liest aus der Standardeingabe und schreibt auf die Standardausgabe. Dabei weden im Schnitt 2% der Zeichen geschrieben. 1
2
3
4
5
6
7
8
9
10
11
12
13 | #!/usr/bin/ruby -w
rnd = Random.new # add 0 argument to make repeatable
buffer = ''
while $stdin.read(1024, buffer)
buffer.bytesize.times do |idx|
buffer.setbyte(idx, rnd.rand(256)) if rnd.rand(100) < 2
end
$stdout.write(buffer)
end
|
- Nicht nur ersetzen - sondern auch zusätzliche Zeichen einfügen oder auch löschen?
Du kannst den Code oben so anpassen, dass zufallsgesteuert Zeichen eingefügt oder entfernt werden.
|
senden9
Anmeldungsdatum: 8. Februar 2010
Beiträge: 965
Wohnort: Österreich
|
Hier eine Pythoninterpretation:
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 | #!/usr/bin/python3
import sys
import random
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("rand", help="Ein Wert zwischen 0 und 100", type=int)
parser.add_argument("-b" ,"--bs", help="Blockgröße", default=1024, type=int)
parser.add_argument("-m", "--mode", help="Modus", choices=["replace", "add", "remove"], default="replace")
args = parser.parse_args()
while True:
line = sys.stdin.buffer.read(args.bs)
if len(line)==0:
sys.exit(0)
out = bytearray()
for el in line:
if random.random() < (args.rand/100):
if args.mode == "replace":
out.append(random.randint(0,255))
elif args.mode == "add":
out.append(random.randint(0,255))
out.append(el)
elif args.mode == "remove":
pass
else:
out.append(el)
sys.stdout.buffer.write(out)
sys.stdout.buffer.flush()
|
Beispiel:
./manipulate_random.py --mode replace 50 # Ersetzt ca. 50% der Zeichen durch ein zufälliges Zeichen. ./manipulate_random.py --mode add 50 # Fügt ca. jedes zweite Zeichen ein zufälliges Zeichen hinzu. ./manipulate_random.py --mode remove 50 # Lässt ca. jedes zweite Zeichen aus. ./manipulate_random.py --mode remove 25 # Lässt ca. jedes vierte Zeichen aus.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Sowas ginge sogar mit einem Shellskript: 😉 Hier habe ich es mal über Einlesen zufällig-langer Strings gemacht: | #!/bin/bash
while read -rd '' -n $(( RANDOM % 50 )) ; do # lies eine zufällige Anzahl Zeichen, max. 50
printf "%s" "${REPLY%?}" # drucke alles außer dem letzten Zeichen
tr -dc "[:print:]" < /dev/urandom | head -c1 # gib 1 druckbares Zufallszeichen aus
read -rd '' -n $(( RANDOM % 50 )) # lies nochmal eine zufällige Anzahl Zeichen
printf "%s" "$REPLY" # und drucke sie
done
|
Für eine mittlere Störhäufigkeit von 10% (statt 2%) habe ich es mal getestet: track@lucid:~$ echo 1234567890123456789012345678901234567890 | ./stör
12345678,012b45678901O345678901234L67890 LG, track
|
senden9
Anmeldungsdatum: 8. Februar 2010
Beiträge: 965
Wohnort: Österreich
|
Drei Varianten sollten reichen ☺ Achja, bei der Python-Variante kann man mittels -b [bytes] oder --bs [bytes] noch die Blockgröße in Bytes angeben.
|