PlanetXML

Siemens S55 Addressbuch auslesen

Im Mai 2004 hatte ich mal versucht das Adressbuch meines Siemens S55 auszulesen. Die Daten sind in einer Datei mit dem Namen "5f07.adr" gespeichert, die sich z.B. mit der Date Suite auf den PC übertragen läßt. Nach ein Paar Stunden mit einem Hex-Editor kam folgendes Python-Script dabei heraus:

# Index der entsprechenden felder in der Datei
VORNAME       = 0
NACHNAME      = 1
FIRMA         = 2
STRASSE       = 3
STADT         = 4
LAND          = 5
EMAIL1        = 8
EMAIL2        = 9
URL           = 10
PLZ           = 11
HOME_PHONE    = 12
COMPANY_PHONE = 13
MOBILE_PHONE  = 14
FAX1          = 15
FAX2          = 16
BIRTHDAY      = 22

def phone_num(data):
    #Konvertiert eine BCD-kodierte Telefonnummer in einen String
    #(jede Ziffer wird durch 4 Bit dargestellt)
    res = ""
    for ch in data:
        i1   = ord(ch) & 0x0F
        i2   = (ord(ch) & 0xF0) >> 4
        if (i1 != 0x0F):
            res += chr(i1 + ord('0'))
        if (i2 != 0x0F):
            res += chr(i2 + ord('0'))
    return res

def read_header(fp):
    #der Header enthält die Längenangaben für die einzelnen Felder
    header = []
    for i in range(28):
        header.append(ord(fp.read(1)))
        fp.read(1)
    return header

def read_entry(fp):
    header = read_header(fp)
    if (header[0] == 0xdd):
        #unbenutzter Block
        while (True):
            ch = ord(fp.read(1))
            if (ch != 0xdd):
                break
        fp.seek(-1,1)
        return
    data   = []
    for s in header:
        if s == 0:
            s = 2
        line = fp.read(s)
        data.append(line)
    print "Vorname : ", unicode(data[VORNAME] ,'utf-16')
    print "Nachname: ", unicode(data[NACHNAME],'utf-16')
    print "Handy   : ", phone_num(data[MOBILE_PHONE])
    print "Fest    : ", phone_num(data[HOME_PHONE])
    print "Firma   : ", phone_num(data[COMPANY_PHONE])
    print "Geb.    : ", data[BIRTHDAY]
    print "---------------------------------------"

fp = file("5f07.adr","rb")
fp.seek(0x42)
for i in range(30):
    read_entry(fp)
    #print fp.tell()