Zufällig hex ausgeben....

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
tomycat
User
Beiträge: 26
Registriert: Samstag 31. August 2019, 15:27

hallo,

Code: Alles auswählen

from random import *

def one_hex():
        hex = randint(1, 100) # max 100
        return hex
        
def mix():
        inhalt ='Start'
        for i in range(randint(1, 100)): # max 100
            inhalt += '\x' + str(one_hex())        ##### geht nicht :-(
        return inhalt 
print(mix()) 


Ich will Zufällige Hex Werte mit unterschiedliche Längen ausgeben, wie kann ich die Problem Zeile lösen?
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Backslash ist ein Escapezeichen und muß deshalb escaped werden, wenn man es ausgeben will.
Statt Strings mit + zusammenzustückeln, nimmt man Stringformatierung, da kann man Zahlen auch als Hex ausgeben lassen. Benutze keine *-Importe:

Code: Alles auswählen

from random import randint

def mix():
    werte = (randint(1, 100) for _ in range(randint(1,100)))
    hex_werte = ''.join(f"\\x{k:x}" for k in werte)
    return f"Start{hex_werte}"
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei die Grenzen 1 bis 100 komisch sind weil das zwischen 1 und zwei Hexziffern produziert aber nicht alle Möglichkeiten abdeckt. Das ergibt also keine gleichmässige Verteilung, es gibt Ergebnisse die wahrscheinlicher sind als andere.

Was ist denn die eigentliche Aufgabenstellung dahinter? Wofür soll das gut sein?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
tomycat
User
Beiträge: 26
Registriert: Samstag 31. August 2019, 15:27

thx,
ich sollte eigentlich mit print \x41 als A ausgeben lassen, aber nicht als \x41
Da gibt es doch eine Convert Funktion
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Also willst Du keine zufälligen Hexwerte sondern zufällige ASCII-Zeichen.

Code: Alles auswählen

werte = (randint(32, 128) for _ in range(randint(1,100)))
zeichen = ''.join(map(chr, werte))
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@tomycat: Sorry aber der Satz macht keinen Sinn für mich. Oder sind das zwei Sätze? Wobei ich es auch dann nicht verstehen würde.

Die Escape-Sequenz "\x??" mit Hexadezimalziffern an stelle der Fragezeichen gilt für literale Zeichenketten. Da muss also tatsächlich "\x41" *so* in der Zeichenkette im *Quelltext* stehen. Das wird vom Compiler ausgewertet, bevor der Code läuft. Du kannst da nicht zur Laufzeit Teile von generieren.

Falls Du zufällige Zeichen mit den Unicode-Codepoints 1 bis 100 erstellen willst, dann ist das ganze Hexgedöns unsinnig. Dann würde man einfach ein Unicode-Zeichen mit `chr()` erstellen.

Aber darum noch mal die Frage: Was ist das Problem das Du hier zu lösen versuchst? Wozu wird das am Ende verwendet?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Sirius3: `randint()` ist inklusive Endpunkt. Also entweder `randrange()` oder den Endpunkt auf 127 setzen. Ich würde letzteres machen. Beziehungsweise 126, weil das ASCII-Zeichen 127 kein druckbares Zeichen ist. Falls das für den OP einen Unterschied macht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
tomycat
User
Beiträge: 26
Registriert: Samstag 31. August 2019, 15:27

thx,
die print Ausgabe muss so aussehen AAA, sie dient nur als Kontrolle.
leider will meine Funktion nur Hexwerte von einem großen Bereich.
ich könnte jetzt eine Tabelle erstellen wie

meinarry[00] = '0'
meinarry[01] = '1'

… bis 256

Per Zufall ordne ich mein_end_string += <--------

Das muss auch einfacher gehen.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

@tomycat Ich verstehe deinen Beitrag nicht. Du gehst auch überhaupt nicht auf die bisherigen Antworten ein, aus denen sich Fragen ergeben, die du beantworten solltest.

Die "Tabelle", die du zeigst, ist keine Tabelle sondern du ordnest einem dict einzelne Werte zu. Wenn der Wert dem Schlüssel entspricht, macht das natürlich keinen Sinn.

Der erste Schritt ein Problem zu lösen - erst recht in der Programmierung - besteht darin das Problem zu formulieren. Das solltest du als erstes versuchen.

Was ist das Problem? Was erwartest du vom Programm? Was passiet stattdessen?
Und das in klar verständlichen Worten und Sätzen.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@tomycat: du hast jetzt also dein Problem gelöst, das wir hier immer noch nicht genau kennen. Wenn du einen lauffähigen Code posten würdest, könnten wir hier sehr schnell sagen, ob das einfacher geht.
tomycat
User
Beiträge: 26
Registriert: Samstag 31. August 2019, 15:27

thx,
hmmmmm ja, ich Probiere jetzt mal mein Problem anders zu beschreiben. :-)
Die zufällige Länge lassen wir mal weg, die kann ich selber lösen :-)
Mehr darf ich nicht sagen wegen close Code.

ok, es gibt eine Funktion die will als Parameter einen zufälligen HEX Wert, von 00 bis FF. Nicht mehr.
Die Will ich ausgeben lassen als print. Ich weis dass da Müll Dabei ist, egal. Ich will mit print NUR sehen, dass das was passiert.

Code: Alles auswählen

# Erstellung von einem zufälligen Hex Wert....
zufaelliger_Hex_Wert = randum_bum_bum_hex # von \x00 bis \xFF
print(zufaelliger_Hex_Wert) # nur um zu sehen dass ,da was passiert
# Dieser Zufällige HEX Wert wird weiterverarbeitet...
superfunktion(zufaelliger_Hex_Wert)
Ein umständlicher Lösungsvorschlag wäre:

Code: Alles auswählen

Ich mache eine Tabelle, Liste, was auch immer :-)

mein_array[0] = '\x00'
#....bis....
mein_array[256] = '\xFF'

zufaelliger_dez_Wert = random.uniform(0,256)
print(zufaelliger_Hex_Wert) # nur um zu sehen dass ,da was passiert
superfunktion(mein_array[zufaelleriger_dez_Wert ])


Diese Lösung würde gehen, aber die Langsam und ich habe keine Lust eine Tabelle von 0 bis 256 zu erstellen.
Besser kann ich mein Problem nicht beschreiben.
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@tomycat: Nach der Beschreibung willst Du keinen ”Hexwert” sondern einfach ein Zeichen mit einem zufälligen Unicode-Codepoint zwischen 0 und 255 (inklusive). Dafür ist die `chr()`-Funktion da. Wobei man da auch eine entsprechende Zeichenkette erstellen könnte, aus der man dann mit `random.choice()` auswählt.

Du verwirrst hier glaube ich alle, und auch Dich selbst, mit ”Hexwerten”, denn ich sehe nicht wo Du den tatsächlich brauchst.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@tomycat: die Musterlösung habe ich Dir doch schon gezeigt.
Wobei zufällige Unicode-Points etwas seltsam ist, willst Du nicht vielleicht eigentlich zufällige Bytewerte?
tomycat
User
Beiträge: 26
Registriert: Samstag 31. August 2019, 15:27

thx all,
mit chr(zufälliger Wert von 0 bis 256) bekomme ich doch Hexwerte von 00 bis FF oder nicht?
wenn ja dann habe ich die Lösung :-)
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Fast. Wert bis 255... Aber sonst, ja.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

tomycat hat geschrieben: Mittwoch 22. April 2020, 11:12 mit chr(zufälliger Wert von 0 bis 256) bekomme ich doch Hexwerte von 00 bis FF oder nicht?
Die Frage ist ohnehin, wie du Hex-Wert definierst. Meinst du einen String wie "A1"? Oder meinst du die Hex-Darstellung von Zahlen im Python-Code wie `0xA1`?
Antworten