Coder une datetime de 14 caractères en 5 caractères - Algo - Programmation
Marsh Posté le 14-04-2004 à 13:07:49
pas possible.
Il te faut 5 car juste pour la date. Tu peux coder en hexa le mois (1 - 12)... pour le reste...
Marsh Posté le 14-04-2004 à 13:24:25
Eniac a écrit : Salut, |
En binaire ça rentre, mais c'est binaire !
|
En alphanumérique c'est pas possible car simplement pour enregistrer l'heure (hh:mm:ss) il te faut 5 caractères en hexa (nombre de secondes ecoulees depuis 00h00m00s) ou 3 en base 64 (0..9,a..z,A..Z).
Il y a 31 536 000 secondes par année (année non bixestile).
Donc même en codant un nombre de secondes écoulées depuis une date fixe en base 64 tu ne pourrais avoir que 34 années environ. Par exemple si tu choisis le 01/01/2000 à 00h00m00s la date max serait (en gros) le 31/12/2034 à 23h59m59s. C'est pas génial.
ZZZZ (en base 64, voir plus haut) = 1 073 741 824.
Oups j'ai dit "base 64" mais en fait c'est 62 !
Marsh Posté le 14-04-2004 à 13:39:11
Si il veut plus simple, il vire l'année, il lui reste donc 5 nombres à coder sur 5 caractères. Sachant que les nombres vont de 0 à 60 et que alphabet majuscule+minuscule+chiffres=26+26+10=62 possibilités, c'est pas si difficile à convertir.
Marsh Posté le 14-04-2004 à 13:55:08
Cadeau:
Code :
|
|
Marsh Posté le 14-04-2004 à 16:22:53
Hello,
merci pour vos réponses
le seul problème c'est que je ne suis pas case sensitive,
donc j'ai seulement 26 lettres + 10 chiffres comme possibiltés...
ça me prend la tête
et finalement je crois que je dois laisser les mois et l'année car je sinon je serai emmerdé tous les réveillons...
Marsh Posté le 15-04-2004 à 12:09:13
Eniac a écrit : Hello, |
Dans ce cas tu peux coder une date sur une période de deux ans max (si tu garde une précision à la seconde), par exemple tu peux enregistrer une date entre le 01/01/2000 à 00h00m00s et le 31/12/2001 à 23h59m59s c'est un peu limité en fait !
Quel est l'intervalle de date que tu dois gérer ?
De 1900 à 2100 ?
Sans les secondes tu peux gérer environ 114 ans.
Marsh Posté le 16-04-2004 à 12:07:41
C'est pour Eniac (trop fatigué pour poster lui-même ) : "à la limite, je veux bien virer les secondes s'il faut. L'intervalle de temps est de maintenant à dans 100 ans. Comment fais-tu pour coder 114 ans ?"
Marsh Posté le 16-04-2004 à 14:56:13
36^5 = 60466176 (On a un nombre allant de 0 à 60466175).
Il y a 1440 minutes par jours.
Donc la valeur maximale représente une durée de 41990,399 jours.
Ce qui donne 114,96345 années (J'ai divisé par 365.25 mais c'est pas précis car 2100 ne sera pas bissextile par exemple).
Donc avec un nombre codé en base 36 avec un maximum de 5 positions on peut gérer presque 115 ans, reste à savoir si c'est suffisant.
Marsh Posté le 16-04-2004 à 16:28:17
Pour compléter l'explication darkoli, tu dois définir une date comme étant un nombre de minutes supplémentaires par rapport à une date référence. Donc il faut :
Pour la lecture, il faut faire les opérations en sens inverse:
Sinon, par curiosité, pourquoi tu es obligé d'écrire une date comme ça ?
Marsh Posté le 19-04-2004 à 10:49:18
ok merci, je crois que je devrais pouvoir m'en sortir
c'est quand même une fameuse prise de tête pour un si petit truc !
Une petite erreur je crois dans l'explication de Darkoli :
la valeur max ne serait-elle pas
36^5 + 36^4 + 36^3 + ... 36^0 = 62 193 781 minutes = 118,2 ans
Vu que d'ici là je serai mort, je crois que si ça ne fonctionne plus, je ne serai pas là pour subir les représailles Oui c'est suffisant.
Une petite erreur aussi, je crois, dans l'explication de _pascal :
"- tu transformes chaque chiffre du nombre en base 36 en alphanumérique "
--> ça ne serait pas plutôt "tu transformes chaque nombre (0...35) en caractère alphanumérique ?
Pour ton info :
difftime()
Finds the difference between two times.
double difftime( time_t timer1, time_t timer0 );
Return Value
difftime returns the elapsed time in seconds, from timer0 to timer1. The value returned is a double-precision floating-point number.
Parameters
timer1
Ending time
timer0
Beginning time
--> si j'ai le temps en secondes je suppose que je peux diviser la valeur de retour par 60 pour avoir le temps en minutes ? et ça tient bien compte des années bissextiles, etc, je suppose ?
Pour satisfaire ta curiosité, je suis sûr un projet qui consiste à utiliser un microcontrôleur intégrant serveur web pour faire de la récolte d'informations sur une ligne de production. Je garde en RAM les informations que je récolte, et toutes les 5 minutes, je génère un fichier XML sur la flash du µC. Un serveur interroge chaque µC, et via FTP, rappatrie ces fichiers.
C'est concernant la désignation de ces fichiers, qui est en dos-style (8 caract alphanum) que j'ai besoin de 3 lettres pour coder le nom de la machine hôte, et me démerder avec les 5 restants pour avoir qqch de significatif. Un n° séquentiel n'est pas très explicite, et est source de problèmes, tandis que l'heure et la date ça me parait le plus intéressant.
Merci A+
Marsh Posté le 19-04-2004 à 11:14:15
Eniac a écrit : Une petite erreur je crois dans l'explication de Darkoli : |
Tu as 5 chiffres avec pour chacun 36 valeurs différentes possibles [0..9,a..z] donc tu as un total de 36*36*36*36*36 (36^5) possibilités sachant que tu peux utiliser la même valeur pour différents chiffres.
Tu peux aller de 0 à zzzzz en base 36 soit de 0 à 60466175 en base 10.
Pour t'en convaincre convertis à la main le nombre "zzzzz" (base 36) en base 10.
zzzzz [36] = (35 * 36^4) + (35 * 36^3) + (35 * 36^2) + (35 * 36) + 35 [10]
Marsh Posté le 19-04-2004 à 11:24:29
autant pour moi !
j'ai tjs été nul dans ces trucs là
sorry
Marsh Posté le 29-04-2004 à 18:41:41
Je continu dans le genre... (pour le fun seulement)
Seconde = 0...59 soit 5,9069 bits
Minutes = 0...59 soit 5,9069 bits
Heures = 0...23 soit 4,5850 bits
Jour = 0...31 soit 5 bits
Mois = 0...11 soit 3,5850 bits
Année = 0...9999 soit 13,2878 bits (forme 1)
Total 24,9838 bits sans l'année
et 38,2716 bits.
On dispose de 36 possibilités (A-Z et 0-9) soit 5,17 bits par caractères.
Roulement de tambours.... BROM BROM BROM... BROM BROM BROM...
TADA !!!
Il faut donc...
- 7,40 caractères soit 8 caractères avec l'année
- 4,83 caractères soit 5 caractères sans l'année
Sans l'année, tu as ta solution, à toi de la mettre en pratique !
Marsh Posté le 30-04-2004 à 08:28:01
Salut,
Solution finale adoptée : 6 caractères, on garde uniquement le chiffre de l'année (par exemple 4 pour 2004) ce qui fait une période de 10 ans, juste ce qu'il faut.
En prenant les valeurs max pour chaque champ, il faut 30 bits, soit 6*5 bits et on peut coder chaque groupe de 5 bits par un caractère 0...9 A...Z.
Je ne prend pas de date de "référence", c'est tout aussi simple comme ça.
Merci A+
Marsh Posté le 01-05-2004 à 00:05:49
Alors il y a un problème !
Les minutes et les secondes sont sur combien de bits ?
Marsh Posté le 01-05-2004 à 02:16:40
C'est bien ce que je dis, il y a un problème !
Sauf s'il supprime un bit pour minutes et secondes et conserve une présion de 2 secondes et 2 minutes...
Mais je vois pas l'intérêt.
Donc j'en remet une couche l'heure tient sur 16,4 bits.
Avec 6 caractères (soit 31 bits environ), il reste 14,6 bits. En ajoutant le mois et le jour, il reste environ 6 bits.
Mais bon, que de prise de tête... Le plus simple est de faire un timestamp commençant par exemple à 0:00:00 1/1/1980... Cela laisse une marche de pas mal d'années... (Même si ce n'est pas une solution viable pour l'avenir)
Marsh Posté le 04-05-2004 à 08:48:32
Vous trouverez ma démarche expliquée en clair ici
http://users.skynet.be/fa353969/NameLogic.pdf
La fonction C qui s'en charge :
Arguments :
Code :
|
Code :
|
Marsh Posté le 05-05-2004 à 11:50:33
//48 means "0" in ASCII code
bien essayé tu aurais du écrire
//48 means '0' in ASCII code
ou alors '0' mais se faut trop simple ///
(converted_td%32)<=35
mince alors ...
Marsh Posté le 14-04-2004 à 12:12:34
Salut,
J'ai une chaine datetime du type
AAAAMMDDHHMMSS
20040314121025
et j'aimerais coder ça sur seulement 5 caractères alphanumérique (lettres majuscules et chiffres seulement)
Si c'est possible, comment faire ?
(éventuellement en supprimant les 4 chiffres de l'année et même les deux du mois)
Merci A+
Si vous avez une fonction toute faite (en C) je suis preneur
Message édité par Eniac le 14-04-2004 à 16:26:33