HSG |
|
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))