Hallo,
zwecks Fuzzing möchte ich ein zufälliges Bit eines 147 char-langes Strings (1176 Bits) kippen.
Habe mit python noch nicht viel Erfahrung und bisher folgenden Ansatz ausprobiert, der leider nicht funktioniert:
Der String ist in "buffer"
randomBit = 0b1
binBuffer = 0b0
binBuffer = bin(buffer)
binBuffer = binBuffer^(randomBit<<randint(0,1175))
buffer = str(binBuffer)
Hoffe jemand kann mir dabei helfen, meine Lösung ist wohl etwas zu einfach gedacht
Ein zufälliges Bit eines Strings kippen
Hallo und willkommen im Forum!
Am einfachsten ist es, wenn du den String einfach in einen Integer umwandelst:
Das +1 ist natürlich nur ein Beispiel, hier musst du dann deine kokrete Operation einsetzen. Ob du die Reihenfolge der Zeichen in den Strings umdrehen musst hängt natürlich von deiner Anwendung ab.
Sebastian
Am einfachsten ist es, wenn du den String einfach in einen Integer umwandelst:
Code: Alles auswählen
>>> text = "spam ham and eggs"
>>> n = sum(ord(c)<<8*i for (i, c) in enumerate(text[::-1]))
>>> n += 1
>>> "".join(chr((n>>8*i)&0xFF) for i in range(len(text)))[::-1]
'spam ham and eggt'
Sebastian
Das Leben ist wie ein Tennisball.
habe jetzt folgende Zeilen hinzugefügt:
randomBit = bin(1)
n = sum(ord(c)<<8*i for (i, c) in enumerate(buffer[::-1]))
n = n^(randomBit<<randint(0,1175))
"".join(chr((n>>8*i)&0xFF) for i in range(len(buffer)))[::-1]
=>
invalid syntax in
"".join(chr((n>>8*i)&0xFF) for i in range(len(buffer)))[::-1]
am ;
randomBit = bin(1)
n = sum(ord(c)<<8*i for (i, c) in enumerate(buffer[::-1]))
n = n^(randomBit<<randint(0,1175))
"".join(chr((n>>8*i)&0xFF) for i in range(len(buffer)))[::-1]
=>
invalid syntax in
"".join(chr((n>>8*i)&0xFF) for i in range(len(buffer)))[::-1]
am ;
Tja, das passiert, wenn man blindes Copy&Paste macht (unterstelle ich jetzt einfach mal). Aufgrund eines Bugs im Forumcode wird aus dem kaufmännischen Und (&) immer ein ``&``. Das musst du halt manuell ersetzen.
ok dieser Fehler ist schonmal weg.snafu hat geschrieben:Tja, das passiert, wenn man blindes Copy&Paste macht (unterstelle ich jetzt einfach mal). Aufgrund eines Bugs im Forumcode wird aus dem kaufmännischen Und (&) immer ein ``&``. Das musst du halt manuell ersetzen.
jetzt hab ich noch einen in
randomBit = bin(1)
Und die Zeile
n = n^(randomBit<<randint(0,1175))
ist so ok für mein Vorhaben?
@fuzzing:
Ja das funktioniert so. Allerdings würde ich es wohl über 8Bit-integer mit String-Slicing machen und nicht den ganzen String in eine Zahl wandeln, ungetestet:
Ja das funktioniert so. Allerdings würde ich es wohl über 8Bit-integer mit String-Slicing machen und nicht den ganzen String in eine Zahl wandeln, ungetestet:
Code: Alles auswählen
byte, bit = divmod(randint(0, 1175), 8)
s = s[:byte] + chr(ord(s[byte]) ^ (1<<bit)) + s[byte+1:]