Преобразовать хеш в шестнадцатеричную строку символов

StackOverflow https://stackoverflow.com/questions/1436336

  •  07-07-2019
  •  | 
  •  

Вопрос

на этой странице:

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

он говорит, что после того, как вы сгенерируете хэш, вы потом:

преобразовать хеш в шестнадцатеричную строку символов

есть ли в csharp код для этого?

Это было полезно?

Решение

Чтобы получить хеш, используйте System.Security.Cryptography.SHA1Managed class .

РЕДАКТИРОВАТЬ : вот так:

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

Чтобы преобразовать хеш в шестнадцатеричную строку, используйте следующий код:

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

Если вы хотите более быструю реализацию, используйте следующую функцию:

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);
}

Другие советы

Я пока не могу комментировать, недостаточно повторений, но Лиор смешивает Java с C # в очень неправильном ответе.

байт в C # является байтом без знака, который является полной противоположностью всем другим типам целых чисел в C #, которые подписаны по умолчанию.

Часть 0xFF абсолютно бессмысленна, потому что даже если байт был подписан, например, 0xFE равен -2. Например, использование поразрядно-и с 0xFE и 0xFF не остановит отрицательный результат 0xFE. 0x7F будет.

Что касается главного ответа, я уверен, что эти микрооптимизации могут помочь, хотя они и являются микрооптимизациями, которые, вероятно, не будут иметь никакого реального значения, потому что JIT-компилятор может просто делать что-то еще, и потому что компьютеры просто слишком быстро.

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

Небольшое изменение, чтобы использовать битовый сдвиг и битовые операции вместо делителя и по модулю.

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

Это еще одна «оптимизация», хотя я считаю ее более читаемой. Может быть, это потому, что я знаю большую часть таблицы ASCII наизусть.

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

Если вы пытаетесь получить гекс в нижнем регистре (без ToLower), просто поменяйте местами 55 на 87. Это очень просто.

Обновление: похоже, что Лиор или кто-то удалил его очень неправильный ответ Это был хороший ход.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top