Question

sur cette page:

http://www.shutterfly.com/documentation/OflyCallSignature.sfly

il est dit qu'une fois que vous générez un hachage, alors:

convertir le hachage en chaîne de caractères hexadécimale

y at-il du code dans csharp pour le faire?

Était-ce utile?

La solution

Pour obtenir le hachage, utilisez le System.Security.Cryptography.SHA1Managed classe .

MODIFIER : comme ceci:

byte[] hashBytes = new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(str));

Pour convertir le hachage en chaîne hexadécimale, utilisez le code suivant:

BitConverter.ToString(hashBytes).Replace("-", "");

Si vous souhaitez une mise en œuvre plus rapide, utilisez la fonction suivante:

private static char ToHexDigit(int i) {
    if (i < 10) 
        return (char)(i + '0');
    return (char)(i - 10 + 'A');
}
public static string ToHexString(byte[] bytes) {
    var chars = new char[bytes.Length * 2 + 2];

    chars[0] = '0';
    chars[1] = 'x';

    for (int i = 0; i < bytes.Length; i++) {
        chars[2 * i + 2] = ToHexDigit(bytes[i] / 16);
        chars[2 * i + 3] = ToHexDigit(bytes[i] % 16);
    }

    return new string(chars);
}

Autres conseils

Je ne peux pas encore commenter, pas assez de représentants, mais Lior mélange Java et C # dans une très mauvaise réponse.

octet en C # est un octet non signé, qui est le contraire de tous les autres types de nombres entiers en C #, signés par défaut.

La partie 0xFF est complètement inutile car même si l'octet était signé, 0xFE, par exemple, vaut -2. L'utilisation d'un bitwise et avec 0xFE et 0xFF, par exemple, n'empêcherait pas le nombre négatif 0xFE d'être le résultat. 0x7F le ferait.

En ce qui concerne la meilleure réponse, je suis presque certain que ces micro-optimisations pourraient vous aider, bien qu’il s’agisse de micro-optimisations qui ne feront probablement pas grande différence, car le compilateur JIT pourrait faire autre chose et les ordinateurs étant trop vite flamboyant.

    chars[2 * i + 2] = ToHexDigit(bytes[i] / 16);
    chars[2 * i + 3] = ToHexDigit(bytes[i] % 16);

Petit changement pour lui faire utiliser bitshift et bitwise ops au lieu du diviseur et modulo.

    chars[2 * i + 2] = ToHexDigit((bytes[i] >> 4) & 0xF);
    chars[2 * i + 3] = ToHexDigit(bytes[i] & 0xF);

C’est l’autre "optimisation", même si je le vois comme plus lisible. C'est peut-être parce que je connais la plupart des tables ASCII par cœur.

    private static char ToHexDigit(int i)
    {
        return (char)(i + (i < 10 ? 48 : 55));
    }

Si vous essayez d’obtenir un hexagone en minuscule (sans ToLower), il suffit de permuter 55 contre 87. C’est très simple.

Mise à jour: Il semblerait que Lior ou quelqu'un ait retiré sa réponse. C'était un bon coup.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top