Datum in 3 Zeichen Darstellen

Andrej Dyck

Mitglied
Hallo Leute,

Ich bin neu hier, aber ich glaube, dass mir hier geholfen werden kann.
Ich habe schon im Internet nach einer Lösung für mein Problem gesucht, aber nichts gefunden, wobei ich nicht glaube, dass sich damit noch keiner den Kopf zerbrochen hat.
Also:
Aus "Platzmangel" (in einem Key) muss ich das Datum in 3 Zeichen unterbringen. Ich habe auch schon eine ungefähre Idee, jedoch weiß ich nicht wie ich das umsetzten sollte.
Meine Idee:
das Datumsformat: tt.mm.jjjj
Für die Tage brauche ich nur 5 Bits, da 2^5 = 32 sind (Monat hat max. 31 Tage wenn das jemand nicht weiß ;))
Für den Monat brauche ich 4 Bits, da 3 nicht außreichen.
und für das Jahr, die Restlichen 15 Bits, wobei auch 13 vollkommen reichen würden, oder wenn man nur JH nimmt, dann auch nur 10 Bits, aber mit 15 Bits komme ich insgesammt auf 3 Bytes ( ^= 3 Zeichen ).

Mein "Problem", wie krieg ich das Datum Binär umgewandelt und aus den 24 Bits 3 Bytes?

Vielen Dank im Vorraus
Andrej
 
Hallo,
schau mal:

C:
#include <stdio.h>

//for packing
#define PART1(x, y) ((unsigned char)(x << 3) + \
                        ((unsigned char) (0xE & y) >> 1))
#define PART2(x,y) ((unsigned char)((0x1 & x) << 7) + \
                        (unsigned char)((0x7F00 & y) >> 8))
#define PART3(x) ((unsigned char)(0xFF & x))
//for unpacking
#define MONTH(x,y) (((x & 0x7) << 1) + (y >> 7))
#define YEAR(x,y) (((0x7F & x) << 8) + y)
#define DAY(x) (x >> 3)

struct packed_date{
    unsigned char part1;
    unsigned char part2;
    unsigned char part3;
};

void pack_date(char* date_string, struct packed_date* d){
    int day, month, year;
    sscanf(date_string, "%d.%d.%d", &day, &month, &year);
    d->part1 = PART1(day, month);
    d->part2 = PART2(month, year);
    d->part3 = PART3(year);
}

void unpack_date(struct packed_date* d, char* res){
    int day, month, year;
    day = DAY(d->part1);
    month = MONTH(d->part1,d->part2);
    year = YEAR(d->part2, d->part3);
    sprintf(res, "%d.%d.%d", day, month, year);
}

int main(){
    char date_string[] = "14.07.2006";
    char res_date[20];
    struct packed_date d;
    pack_date(date_string, &d);
    printf("Packed date in %d bytes : part1: %d, part2: %d, part3: %d\n",
                sizeof(d),
                d.part1,
                d.part2,
                d.part3);
    unpack_date(&d, res_date);
    printf("Unpacked date: %s\n", res_date);
    return 0;
}

Gruß,

RedWing
 
Zuletzt bearbeitet:
Hallo,
das is nur ein Beispiel wie es funktionieren koennte, du solltest den Code
nutzen um es zu verstehen, da ich für Fehlerfreiheit nicht garantieren kann und
auch nicht will...

Gruß,

RedWing
 
Hallo Redwing,

ich hab mal ein beispiel handschriftlich gerechnet:

tag: 14 => 01110
monat: 07 => 0111
jahr: 2006 => 000011111010110

Also:

part1: 01110011 ^= 115
part2: 10000111 ^= 135
part3: 11010110 ^= 214

Im beispielprogramm kommt aber für part2 240 raus. Ich sehe im code aber kein (logischen)fehler. und er wandelt es ja auch richtig zurück.
hmm!?

Gruß Andrej
 
Hallo,

doch im Code ist ein Fehler, war aber nicht beabsichtigt :)

C:
#define PART2(x,y) ((unsigned char)((0x1 & x) << 7) + \
                      (unsigned char)((0x7F00 & y) >> 4))
...
#define YEAR(x,y) (((0x7F & x) << 4) + y)
muss heißen:
C:
#define PART2(x,y) ((unsigned char)((0x1 & x) << 7) + \
                      (unsigned char)((0x7F00 & y) >> 8))
...
#define YEAR(x,y) (((0x7F & x) << 8) + y)

Gruß,

RedWing
 
Hallo,

is eigentlich ganz einfach:

Stell dir einen Integer einfach als eine Folge von 32 0en und 1en vor.

Wenn du jetzt sagst:

5 << n; //verschiebst du die Bits des Integers 5 um n Stellen nach links (also im Ergebniss der Operation).
5 >> n; //nach rechts analog...


Gruß,

RedWing
 
Hallo,

achso :)

Das sind einfach Masken und Bitoperationen zur Bitmanipulation...

Bsp1.:

Du willst die letzten 3 Bitstellen der Zahl 43 haben, dann kann man das so machen:

43 & 0x7 daraus wird dann:

101011b & 111b = 011b = 3

Also das & ist einfach ein Bitweises &.
Und mithilfe einer speziellen Maske kann man dann Bits einer Zahl ein bzw ausblenden...

Gruß,

RedWing
 
Zurück