Почему бы не использовать Base64, но преобразовать символы +
и /
в -
и _
соответственно?См. http://en.wikipedia.org/wiki/Base64#Variants_summary_table для описания.
Это довольно часто используется, возможно, наиболее известный на YouTube для своих идентификаторов видео.
Этот код превращает 64-битное значение в base64закодированный ключ, используя это преобразование:
public static string Base64EncodeKey(ulong key)
{
// get bytes
byte[] keyBytes = BitConverter.GetBytes(key);
// get base64 value
string keyString = Convert.ToBase64String(keyBytes);
// The base64 encoding has a trailing = sign, and + and - characters.
// Strip the trailing =.
keyString = keyString.Substring(0, keyString.Length - 1);
// convert + to - (dash) and / to _ (underscore)
keyString = keyString.Replace('+', '-');
keyString = keyString.Replace('/', '_');
return keyString;
}
Обратное преобразование закодированного ключа обратно в ulong
:
public static ulong Base64DecodeKey(string keyString)
{
// convert - to +, and _ to /
keyString = keyString.Replace('-', '+');
keyString = keyString.Replace('_', '/');
// add the trailing =
keyString += '=';
// convert to bytes
byte[] keyBytes = Convert.FromBase64String(keyString);
// get the encoded key
ulong encodedKey = BitConverter.ToUInt64(keyBytes, 0);
return encodedKey;
}
Вы можете сделать нечто подобное с 32-битными ключами.
Обновление:
Я вижу, что вы сказали, что количество байтов различно.Если вы знаете, что значение всегда составляет 32 бита или меньше (или 64 бита или меньше), вам, вероятно, лучше использовать технику, которую я описал выше.Если вам действительно нужно кодировать строку переменной длины, вы все равно можете использовать модифицированную схему кодирования base64, которая заменяет +
и /
на -
и _
.См. RFC 4648 для других рекомендаций.