Если у вас есть 18 символов в диапазоне от 0 до 127 и число в диапазоне от 0 до 999 и максимально сжато, то для этого потребуется 17 байтов.
>>> math.log(128**18 * 1000, 256)
16.995723035582763
Возможно, вы сможетевоспользоваться тем, что некоторые символы, скорее всего, не используются.В частности, маловероятно, что есть какие-либо символы ниже значения 32, и 127 также, вероятно, не используется.Если вы можете найти еще одного неиспользуемого символа, чтобы сначала преобразовать символы в базу 94, а затем упаковать их в байты как можно более точно.байт!
Пример кода
Вот пример кода, написанного на Python (но написанного в очень императивном стиле, так что его легко понятьПрограммисты питона).Я предполагаю, что на входе нет тильд (~
).Если они есть, вы должны заменить их другим символом перед кодированием строки.
def encodeChar(c):
return ord(c) - 32
def encode(s, n):
t = 0
for c in s:
t = t * 94 + encodeChar(c)
t = t * 1000 + n
r = []
for i in range(16):
r.append(int(t % 256))
t /= 256
return r
print encode(' ', 0) # smallest possible value
print encode('abcdefghijklmnopqr', 123)
print encode('}}}}}}}}}}}}}}}}}}', 999) # largest possible value
Вывод:
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[ 59, 118, 192, 166, 108, 50, 131, 135, 174, 93, 87, 215, 177, 56, 170, 172]
[255, 255, 159, 243, 182, 100, 36, 102, 214, 109, 171, 77, 211, 183, 0, 247]
Этот алгоритм использует способность Python для обработки очень больших чисел.Для преобразования этого кода в C ++ вы можете использовать большую целочисленную библиотеку.
Вам, конечно, понадобится эквивалентная функция декодирования, принцип тот же - операции выполняются в обратном порядке.