Как я могу закодировать строку 1 и 0 для транспорта? - PullRequest
2 голосов
/ 14 октября 2010

Для приложения с генетическим алгоритмом я использую целую загрузку двоичных строк.Большую часть времени они буквально принимают форму 01001010110, так что их можно объединять, видоизменять и «перекрещивать».

Однако для транспортировки и хранения это кажется расточительным.Какой самый простой способ закодировать это как более короткую строку?

Я предполагаю, что это довольно тривиально, но я не уверен, с чего начать.

Обновление: Мне нужно добавить еще одну строку: один из транспортных запросов будет GET-запросом.

Ответы [ 5 ]

8 голосов
/ 14 октября 2010

Самое простое - взять каждую цифру и рассматривать ее как бит.Каждая группа из 8 битов может храниться в байте.Затем вы можете отправить его в виде потока байтов.Вам также нужно будет сохранить длину исходной строки, чтобы вы могли различать «0» и «00».

Вот один способ, которым вы можете написать преобразование из строки в байтовый массив:

byte[] convertToBytes(string s)
{
    byte[] result = new byte[(s.Length + 7) / 8];

    int i = 0;
    int j = 0;
    foreach (char c in s)
    {
        result[i] <<= 1;
        if (c == '1')
            result[i] |= 1;
        j++;
        if (j == 8)
        {
            i++;
            j = 0;
        }
    }
    return result;
}

Обратная операция очень похожа.

Если вам нужно передать данные в виде строки, вы можете base 64 кодировать результирующий байтовый массив.

Возможно, вы также захотите сохранить это в этой форме в памяти тоже.Это будет гораздо эффективнее, чем хранить его в виде строки, где каждая цифра хранится в виде 2-байтового символа.Вы используете примерно в 16 раз больше памяти, чем нужно для хранения ваших данных.Недостаток заключается в том, что использовать его в этой форме немного сложнее, поэтому, если у вас достаточно памяти, то то, что вы в данный момент делаете, может быть просто отлично.

2 голосов
/ 14 октября 2010

Как насчет преобразования его в его целочисленный эквивалент из 10?

int myBin = Convert.ToInt32("01001010110", 2);

Документация Convert.ToInt32 ()

1 голос
/ 14 октября 2010

Или реализовать Кодирование длины серии или Кодирование Хаффмана .Оба довольно просты в реализации.RLE, безусловно, самый простой, но в большинстве случаев степень сжатия будет хуже.Если ваши данные обычно имеют много последовательных символов одного и того же значения, они все равно могут обеспечить существенное улучшение.

1 голос
/ 14 октября 2010

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

0 голосов
/ 14 октября 2010

Ответ Абэ Мисслера - хороший, но с оговоркой, упомянутой в комментариях.

Если 64 бита недостаточно для представления вашей строки, рассмотрите возможность использования BigInt класса http://www.codeproject.com/KB/cs/BigInt.aspx (Возможно, вы захотите добавить to/fromBinary() методы расширения к нему. Или же представить это как ... связанный список байтов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...