![]() |
|||
| 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))