2011-12-28 6 views
1

У меня есть структура, которую я преобразовываю в массив байтов длиной 37, а затем в строку из этого.Сократить строку из байтового массива

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

Сейчас:

  • Преобразование структуры в массив байтов,
  • Преобразование массив байтов в строку базовой 64 (который все еще слишком долго).

Что такое хороший способ сократить эту строку, но все же сохранить сохраненные в ней данные?

Спасибо.

+0

Не могли бы вы привести несколько примеров? –

+0

Какую кодировку текста вы используете? –

+0

Я не использую никакого кодирования текста, я хотел избежать странных символов. –

ответ

2

В общем случае переход от произвольного байта [] к строке требует данных, так как мы предполагаем, что хотим избежать непечатаемых символов.Единственный способ, чтобы уменьшить, это сжать перед базой-независимо (вы можете получить чуть выше base-64, но не много - и это конечно больше не «дружелюбный») - но сжатие выиграло На самом деле, для такого короткого размера. В принципе, вы не можете этого сделать. Вы пытаетесь поместить кварту в банкноты пинты и что не работает.

Возможно, вам придется пересмотреть свои требования. Возможно, сохраните BLOB внутри и выпустите более короткий токен (возможно, 10 символов, возможно, guid), который является ключ фактическому BLOB.

0

Возможно сжатие данных, но вы не можете просто сжать 40-байтовое сообщение до 6 байтов (например).

Если пространство возможных строк/типов ограничено, сопоставьте их со списком (информационное кодирование).

0

Я не знаю ничего лучше, чем с основанием 64, если вы на самом деле нужно передать значение вокруг и, если пользователи должны ввести его.

Если у вас есть центральное хранилище данных, все они могут доступа, вы можете просто указать им идентификатор строки, в которой вы ее сохранили. Это, конечно, зависит от того, насколько секретны эти данные.

Но я подозреваю, что если вы пытаетесь использовать это для активации, вам нужно, чтобы они имели фактическое значение.

Как будет проходить строка? Можете ли вы ожидать, что пользователи могут просто скопировать/вставить? Может быть, некоторое время, потраченное на очистку лишних разрывов строк, которые приходят от читателя электронной почты или даже ваши строки «Копия отсюда» и «Копировать сюда», могут принести больше фруктов!

0

Могут ли символы вашей строки иметь непечатаемые символы? Если да, то вам не нужно base64-кодирование байт, вы можете просто создать строку из них (сохранено 33%)

string str = new string(byteArray.Cast<char>().ToArray()); 

Кроме того, приведены значения в массиве байт ограниченных каким-то образом? Если они попадают в определенный диапазон (т. Е. Не все из 256 возможных значений), вы можете рассмотреть набивку по два в каждом символе строки.

0

Если у вас действительно есть 37 байт информации без излишков, то вам не повезло. Сжатие может помочь в некоторых случаях, но если это ключ активации, я бы порекомендовал иметь ключи от той же длины (и сжатие не будет применять это).

Если этот код будет передан по электронной почте, то я не вижу проблемы с наличием еще более крупного ключа. Другим вариантом может быть вставка дефиса каждые 5 или более символов, чтобы разбить его на более мелкие куски (например, XXXXX-XXXXX-XXXXX-XXXXX-XXXXX).

0

Использовать 160-битный хэш и надеяться на отсутствие столкновений? Это было бы намного короче. Если вы можете использовать справочную таблицу, просто используйте 128 или даже 64-битное инкрементное значение. Намного гораздо короче, чем ваши 37 символов.

Смежные вопросы