Вы можете сначала преобразовать строку в байтовый массив, используя соответствующую кодировку (см. Encoding.GetEncoding
), затем вы можете использовать BitConverter.ToInt32
для преобразования байтового массива в целое число.
string s = "ABCD";
byte[] bytes = encoding.GetBytes(s); /* Use the correct encoding here. */
int result = BitConverter.ToInt32(bytes, 0);
Результат:
1145258561
Чтобы получить строку из целого числа, вы просто изменяете процесс:
int i = 1145258561;
byte[] bytes = BitConverter.GetBytes(i);
string s = encoding.GetString(bytes);
Результат:
ABCD
Обратите внимание, что класс BitConverter дает результат, который зависит от порядкового номера машины, на которой он работает. Если вы хотите, чтобы код был независимым от платформы, вы можете посмотреть на EndianBitConverter в библиотеке Jon Skeet MiscUtil .
Производительность
Я тестировал производительность трех реализаций:
Math.pow
int convert1(string key)
{
int val = 0;
for (int i = 0; i < 4; i++)
{
int b = (int)key[i] * (int)Math.Pow(256, i);
val += b;
}
return val;
}
BitConverter
int convert2(string key)
{
byte[] bytes = encoding.GetBytes(key);
int result = BitConverter.ToInt32(bytes, 0);
return result;
}
Смещение бит
int convert3(string key)
{
int val = 0;
for (int i = 3; i >= 0; i--)
{
val <<= 8;
val += (int)key[i];
}
return val;
}
Петля развернута
int convert4(string key)
{
return (key[3] << 24) + (key[2] << 16) + (key[1] << 8) + key[0];
}
Результаты
Самая большая лучшая производительность:
Method Iterations per second
------------------------------------
Math.Pow 690000
BitConverter 2020000
Bit shifting 4940000
Loop unrolled 8040000
Заключение
Если производительность критична, лучше всего написать собственный метод сдвига битов. Использование стандартного класса BitConverter, вероятно, подходит для большинства ситуаций, когда производительность не критична (если вы не возражаете, что она работает только на компьютерах с прямым порядком байтов).