Walidacja wartości HEX

0

Witam,
W jaki sposób najprościej i najszybciej dokonam wyszukania właściwej wartości HEX poprzez odrzucenie nieprawidłowej części początku i końca?
Mam przekonwertowaną ukrytą wartość ASCII którą sobie już przetłumaczyłem na HEX i w wyniku właściwy ciąg znaków ma być rozwiązaniem zadania i za razem kluczem do portfela BTC z nagrodą.
Mógłbym teoretycznie ręcznie, jednakże chyba lepiej skorzystać z techniki biorąc pod uwagę, że faktyczne rozwiązanie okaże się ... nieobecne w moim kodzie :-)
Bardzo dziękuję za jakieś rozwiązanie .. oczywiście nie pozostanę dłużny jeżeli faktycznie okaże się, że trafny był mój trop.
Pozdrawiam

0

Jeśli dobrze rozumiem 'HEX" to możesz spróbować w ten sposób sobie powyciągać kombinacje ze środka według zadanego kryterium:

code #~ To zmienna w której trzymasz tego hex'a
#~ type(code) powinien być stringiem, albo innym 'kontenterem' żeby kod działał.
code = code[2:] #~ Ponieważ jest to napis, pozbywamy się początku '0x' 
for begin_cut in range(len(code)):
    for end_cut in range(len(code), begin_cut, -1):
        proposed = code[begin_cut:end_cut]
        if len(proposed) == 10: #~ Zakładając że znamy chociaż długość, do bardziej skomplikowanej walidacji polecam funkcję, w innym przypadku odfiltrujmy tylko `if proposed:` żeby nie zwracało nam pustych propozycji.
            print(proposed) #~ I tu wyrzuci ci kolejne kombinacje spełniające kryterium z `if`. 

Możesz też kod opakować w funkcję iteracyjną, i kolejne wyniki wyrzucać yieldem :)

@Edit:
Tak w sumie mogłoby to wyglądać czytelniej:

def main():
    example_code = hex(2132153232131215321)
    for result in begin_end_cut(example_code):
        print(result) #~ I tu decydujesz co z tym chcesz zrobić.


def filtering(value):
    if value and len(value) == 10:
        return True
    return False
    
def begin_end_cut(hex_code):
    hex_code = hex_code[2:]
    for begin_cut in range(len(hex_code)):
        for end_cut in range(len(hex_code)-1, begin_cut, -1):
            proposed = hex_code[begin_cut:end_cut]
            if filtering(proposed): 
                yield(proposed)
                
if __name__ == "__main__":
    main()

@Edit2:
Zakładając że mamy jakąś kombinację znaków do sprawdzenia, np. wiemy że ciąg będzie posiadał 'a' na trzeciej pozycji:

def find_by(string, lengths=[10, 12, 14], search_letter="a", prefix=2):
    """
    string - string where we trying to find something
    lengths - lengths of string which we try to find
    search_letter - letter/substring which we trying to find
    prefix - if letter/substring would begin at example 3-rd position
    """
    start = 0
    substring = string
    while substring:
        start = substring.find("a")
        prefixed = start - prefix
        for length in lengths:
            proposed = substring[prefixed:prefixed+length]
            if filtering(proposed):
                yield proposed
        substring = substring[start+1:]

Możesz wtedy spróbować w ten sposób, też powinno iść to dość szybko.

Ogólnie konkluzja jest taka, że im więcej wiesz jako człowiek, to można złożyć lepsze rozwiązanie, żadnej magicznej metody która znajdzie 'coś' na podstawie braku informacji, niestety nie da się ułożyć, bo zwykły program nie jest mądrzejszy od człowieka w tym wypadku, jedyne co, to jest szybszy w zaprogramowanym działaniu. Wyjątkiem są sprytne algorytmy imitujące inteligencję (sztuczne sieci neuronowe, algorytmy genetyczne etc. etc.) ale tutaj gdy jest brak kryteriów, bazy testowej itd. to raczej nie widzę możliwości zaimplemetowania takich rozwiązań do tego problemu :)

0
Guaz napisał(a):

Jeśli dobrze rozumiem 'HEX" to możesz spróbować w ten sposób sobie powyciągać kombinacje ze środka według zadanego kryterium:

code #~ To zmienna w której trzymasz tego hex'a
#~ type(code) powinien być stringiem, albo innym 'kontenterem' żeby kod działał.
code = code[2:] #~ Ponieważ jest to napis, pozbywamy się początku '0x' 
for begin_cut in range(len(code)):
    for end_cut in range(len(code), 0, -1):
        proposed = code[begin_cut:end_cut]
        if len(proposed) == 10: #~ Zakładając że znamy chociaż długość, do bardziej skomplikowanej walidacji polecam funkcję, w innym przypadku odfiltrujmy tylko `if proposed:` żeby nie zwracało nam pustych propozycji.
            print(proposed) #~ I tu wyrzuci ci kolejne kombinacje spełniające kryterium z `if`. 

Możesz też kod opakować w funkcję iteracyjną, i kolejne wyniki wyrzucać yieldem :)

Wielkie dzięki za pomoc... Nie określiłem jednak +/- wielkości problemu... Ten ciąg znaków hex ma 500kb w txt ;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1