C # конвертировать байтовый массив в int всегда один и тот же номер - PullRequest
1 голос
/ 30 декабря 2011

У меня есть метод, который превращает байтовый массив в целое число

public int Encode(string input)
{
    var bytes = Encoding.Unicode.GetBytes(input.ToLowerInvariant());
    return BitConverter.ToInt64(bytes,0);
}

Почему это целое число не отличается для любой входной строки?

Например

input = "http://www.google.com => 31525695615402088

и

input = "http://www.microsoft.com => 31525695615402088

Ответы [ 6 ]

6 голосов
/ 30 декабря 2011

Поскольку 64 бита составляют 8 байтов, и поэтому ToInt64 потребляет только первые 8 байтов входного массива. Какие первые восемь байтов строк вы использовали?

И, как отмечает alexm, Encoding.Unicode указывает UTF-16, в котором каждый символ на самом деле составляет два байта ( обычно ), поэтому учитываются только первые 4 символа.

3 голосов
/ 30 декабря 2011
'h' == 0x68
't' == 0x74
'p' == 0x70

Двухбайтовые символы с прямым порядком байтов, поэтому "http" дает вам массив, который начинается с:

{ 0x68, 0x00, 0x74, 0x00, 0x74, 0x00, 0x70, 0x00 ...

Интерпретируйте это как 32-разрядное целое число с прямым порядком байтов, и вы получите:

0x0070007400740068

Что, конечно, равно 31525695615402088

2 голосов
/ 30 декабря 2011

Это происходит потому, что 64-разрядное целое число использует 8-байтовую память, а BitConverter преобразует только с использованием первых 8 байтов указанного вами байтового массива, начиная с позиции 0. Каждый предоставленный вами пример ввода начинается с одинаковых 8байт.

Для чего бы то ни было, невозможно выполнить кодирование строки переменной длины без потерь в целочисленный тип данных размером 4–8 байтов.Возможно, вы ищете алгоритм хеширования , который представляет ваши данные в конечном количестве байтов.

2 голосов
/ 30 декабря 2011

Int64 составляет 8 байтов.Я уверен, что вы можете понять это оттуда.

0 голосов
/ 30 декабря 2011

Потому что BitConverter.ToInt64 занимает только первые 8 байтов вашего байтового массива, которые одинаковы для ваших строк. Попробуйте ввести строки "google.com" и "yahoo.com".

0 голосов
/ 30 декабря 2011

Ну, ToInt64 использует 8 байтов - это 4 символа юникода.

...