Сократить строку из массива байтов - PullRequest
1 голос
/ 28 декабря 2011

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

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

Прямо сейчас:

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

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

Спасибо.

Ответы [ 6 ]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

...