HSG

Aktuelle Seite: HSG/Fächer/Informatik/Kryptologie/RSA

Wie wird aus einem String eine Zahl?

Es gibt sicher viele Möglichkeiten, aber rfc3447 beschreibt folgende Methode. Zuerst wird der String nach Wahl zu einer Folge von Bytes codiert. In Python erledigt das z.B. die Funktion bytes.

>>> s = 'Hallö Welt!'
>>> len(s)
11
>>> em = bytes(s,'utf8')
>>> em
b'Hall\xc3\xb6 Welt!'
>>> list(em)
[72, 97, 108, 108, 195, 182, 32, 87, 101, 108, 116, 33]
>>> m = bton(em)
>>> m
22400698533570468703338525729
>>> 

Das 'ö' in 'Hallö' ist natürlich kein Tippfehler, sondern soll zeigen, dass ein Zeichen auch durch mehrere Bytes codiert werden kann. Die Umwandlung der Byte-Liste in eine Zahl geschieht dadurch, dass die Bytes als Ziffern im 256-er-System aufgefasst wird. So wird dann aus dem String 'ABC' die Zahl 4276803.

>>> ord('A')
65
>>> ord('B')
66
>>> ord('C')
67
>>> 65 * 256**2 + 66 * 256**1 + 67 * 256**0
4276803
>>> bton([65,66,67])
4276803
>>> 

Die Funktion bton

def bton(b):
    """
    macht aus dem bytearray (bytes) b (256-System, 256-System, Typ bytes) eine int-Zahl
    """
    if len(b) == 1:
        return b[0]
    else:
        return b[-1] + 256*bton(b[:-1])

Natürlich kann man eine Zahl auch wieder in ihre 'Ziffern' zerlegen.

>>> ntob(4276803)
bytearray(b'ABC')
>>> list(ntob(4276803))
[65, 66, 67]
>>> 

Die Funktion ntob

def ntob(n):
    """
    gibt zu einer int-Zahl n ein bytearray (256-System, big endian)
    zurueck, endrekursiv
    """
    def h(akku,a):
        if a < 256:
            return [a] + akku
        else:
            return h([a%256]+akku,a//256)
    return bytearray(h([],n))

Links