Domanda

Sfida: convertire una "data modificata" DateTime di un file di immagine a un numero / stringa di versione adatto per mantenere unicità in un URL, quindi ogni modifica dell'immagine genera un URL univoco, il numero di versione / stringa è il più breve possibile.

La mancanza di codice è secondaria alla mancanza di scuse numero/stringa se ciò non si qualifica per lo stato del codice-golf :-)

Requisiti

  • C#, .NET Framework V4
  • L'output deve essere caratteri validi per un nome di cartella in un URL.
  • La precisione datetime può essere ridotta al minuto più vicino.

EDIT: questo non è del tutto teorico / puzzle, quindi immagino che preferirei tenerlo qui che sullo scambio di stack di code-golf?

È stato utile?

Soluzione

Utilizzare il DateTime.Ticks Proprietà e quindi convertirlo in un numero di base 36. Sarà molto breve e utilizzabile su un URL.

Ecco una lezione per convertire in/dalla base 36:

http://www.codeproject.com/kb/cs/base36.aspx

Puoi anche usare la base 62, ma non la base64 poiché una delle cifre extra nella base 64 oltre i numeri e le lettere è + che deve essere codificato URL e hai detto che volevi evitarlo.

Altri suggerimenti

Ok, combinando risposte e commenti ho escogitato quanto segue.
Nota: rimozione di byte di imbottitura zero e differenza di data di inizio dall'inizio del progetto per ridurre la dimensione dei numeri.

    public static string GetVersion(DateTime dateTime)
    {
        System.TimeSpan timeDifference = dateTime - new DateTime(2010, 1, 1, 0, 0, 0, DateTimeKind.Utc);
        long min = System.Convert.ToInt64(timeDifference.TotalMinutes);
        return EncodeTo64Url(min);
    }

    public static string EncodeTo64Url(long toEncode)
    {
        string returnValue = EncodeTo64(toEncode);

        // returnValue is base64 = may contain a-z, A-Z, 0-9, +, /, and =.
        // the = at the end is just a filler, can remove
        // then convert the + and / to "base64url" equivalent
        //
        returnValue = returnValue.TrimEnd(new char[] { '=' });
        returnValue = returnValue.Replace("+", "-");
        returnValue = returnValue.Replace("/", "_");

        return returnValue;
    }

    public static string EncodeTo64(long toEncode)
    {
        byte[] toEncodeAsBytes = System.BitConverter.GetBytes(toEncode);
        if (BitConverter.IsLittleEndian)
            Array.Reverse(toEncodeAsBytes);
        string returnValue = System.Convert.ToBase64String(toEncodeAsBytes.SkipWhile(b=>b==0).ToArray());
        return returnValue;
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top