Datum in 3 Zeichen Darstellen
-
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 schon mal
Andrej
-
Du kannst die einzelnen Datumselemente mit Bit-Operatoren zerlegen, zurechtschieben (>> und <<) und neu zusammensetzen:
int tag,mon,jhr; char dat[3]; dat[0] = (tag&0x1F)<<3 | (mon&0x0f)>>1; //5 Bit Tag + 3 Bit Monat dat[1] = (mon&0x01)<<7 | (jhr&0x7fff)>>8);//1 Bit Monat + 7 Bit Jahr dat[2] = (jhr&0xFF); //8 Bit Jahr(zum Auswerten mußt du das gleiche wieder umgekehrt machen)
PS: Du kannst natürlich auch Bitfelder verwenden, ist womöglich übersichtlicher:
struct datum { unsigned tag : 5; unsigned mon : 4; unsigned jhr : 15; }
-
Bitte NICHT. Kostenersparnis an der Stelle der Datumsspeicherung führt üblicherweise zu beeindruckenden Katastrophen.
Und selbst wenn es unbedingt dieser Ansatz sein muß, dann sollte er wenigstens nachvollziehbar sein.
Nochmal: tu es nicht.
Und hier der nachvollziehbare Ansatz:
Die drei Zeichen als "Byte" verwenden. Erstes Byte: Tag. Zweites Byte: Monat. Drittes Byte: Jahr. (Das erlaubt 255 Jahre. Du könntest - je nach Anwendungszweck - also mit 1900 beginnen und hättest genug Werte für Daten bis 2155).unsigned byte jahr = (unsigned byte) meinEingabezeichen;
std::cout << 1900+jahr;Aber, wie gesagt: Das ist BÖSE.
-
Sid2K6 schrieb:
Aber, wie gesagt: Das ist BÖSE.
Blöde Frage, aber warum? Würde mich interessieren was dabei so bösartig schiefgehen kann...
-
Hallo CStoll.
Das hat mir geholfen. Ich danke dir.
Gruß Andrej
-
Sid2K6 schrieb:
Und hier der nachvollziehbare Ansatz:
Die drei Zeichen als "Byte" verwenden. Erstes Byte: Tag. Zweites Byte: Monat. Drittes Byte: Jahr. (Das erlaubt 255 Jahre. Du könntest - je nach Anwendungszweck - also mit 1900 beginnen und hättest genug Werte für Daten bis 2155).Also deinen Ansatz finde ich nicht so nachvollziehbar. wenn ich 1 byte für tage nehme dann hab ich auch (wie beim jahr) 255 möglichkeiten für tage. Da es aber nur max. 31 Tage im Monat gibt reichen 5 Bits!
Mit deiner Möglichkeit hab ich ungenutzen Speicher und kann noch nicht mal alle Jahre abbilden bzw. muss ein "startjahr" festlegen.
Mit meinem Ansatz geht keine Information verloren, deshalb sehe ich auch nicht wieso das "Böse" sein sollte.Gruß Andrej
-
Tobias W schrieb:
Sid2K6 schrieb:
Aber, wie gesagt: Das ist BÖSE.
Blöde Frage, aber warum? Würde mich interessieren was dabei so bösartig schiefgehen kann...
Der Frage schließe ich mich mal an.
@Andrej: Noch ein anderer Vorschlag zur Speicherung: Du könntest dein Datum auch mit den Funktionen der <ctime> verschlüsseln - mktime() und localtime().
(OK, ein time_t ist etwas größer als 3 Byte, aber dafür bekommst du sogar die Uhrzeit dort rein)
-
CStoll schrieb:
Noch ein anderer Vorschlag zur Speicherung: Du könntest dein Datum auch mit den Funktionen der <ctime> verschlüsseln - mktime() und localtime().
(OK, ein time_t ist etwas größer als 3 Byte, aber dafür bekommst du sogar die Uhrzeit dort rein)Ich will ein Key für die Lizensierung einer Software generieren. Die Software soll auch für ein bestimmten Zeitraum freigeschalltet werden können. Dazu muss zumindest ein Teil des Keys entschlüsselbar sein.
Wenn für das Datum mehr als 3 (bzw. 4) Zeichen eingegeben werden sollen (beim Key), kann der Benutzer genau so gut das ganze Datum eingeben. Das sind dann 2 Eingaben, was ich dem Benutzer ersparren will.
Dafür brauch ich aber die Uhrzeit nicht mehr
Gruß Andrej
-
Also deinen Ansatz finde ich nicht so nachvollziehbar. wenn ich 1 byte für tage nehme dann hab ich auch (wie beim jahr) 255 möglichkeiten für tage. Da es aber nur max. 31 Tage im Monat gibt reichen 5 Bits!
Mit deiner Möglichkeit hab ich ungenutzen Speicher und kann noch nicht mal alle Jahre abbilden bzw. muss ein "startjahr" festlegen.
Mit meinem Ansatz geht keine Information verloren, deshalb sehe ich auch nicht wieso das "Böse" sein sollte.Gruß Andrej
Natürlich reichen 5 Bits, aber dann hast du ja 15 Bits für die Jahresangaben (=32768 Jahre), also bleiben auch hier viele Bits ungenutzt!!!
Also ich denke 256 versch. Jahre sollten reichen... (aber vielleicht benutzt man ja dein Programm noch in 3 Jahrhunderten -)
Also der Einfachheit würde ich auch die 3-Byte (T,M,J) Variante vorziehen.