Получение строки, int и т. Д. В двоичном представлении? - PullRequest
0 голосов
/ 02 октября 2009

Можно ли получить строки, целые и т. Д. В двоичном формате? Я имею в виду, что у меня есть строка:

"Hello", и я хочу сохранить его в двоичном формате, поэтому предположим, что "Hello" равно

11110000110011001111111100000000 в двоичном формате (я не знаю, я просто что-то быстро набрал).

Могу ли я сохранить вышеуказанный двоичный файл не в виде строки, а в фактическом формате с битами.

В дополнение к этому, возможно ли хранить менее 8 бит? Я понимаю, что если буква A является наиболее частой буквой в тексте, могу ли я использовать 1 бит для ее сохранения в сжатой форме вместо создания двоичного дерева.

Ответы [ 6 ]

3 голосов
/ 02 октября 2009

Можно ли получить строки, целые, и т.д. в двоичном формате?

Да. Есть несколько разных способов сделать это. Один из распространенных методов - сделать MemoryStream из массива байтов, а затем создать BinaryWriter поверх этого потока памяти, а затем записать в BinaryWriter целые числа, значения типа bool, chars, string и т. Д. Это заполнит массив байтами, которые представляют данные, которые вы написали. Есть и другие способы сделать это тоже.

Могу ли я сохранить указанный выше двоичный файл не в виде строки, а в фактическом формате с битами.

Конечно, вы можете хранить массив байтов.

возможно ли хранить менее 8 бит?

Нет. Наименьшая единица хранения в C # - это байт. Тем не менее, есть классы, которые позволят вам рассматривать массив байтов как массив битов. Вам следует прочитать о классе BitArray.

2 голосов
/ 02 октября 2009

То, что вы ищете, это что-то вроде кодирование Хаффмана , оно используется для представления более общих значений с более короткой битовой комбинацией.

Способ хранения битовых кодов по-прежнему ограничен целыми байтами. Не существует типа данных, который использует меньше байта. Способ хранения битовых значений переменной ширины состоит в том, чтобы упаковать их в конец байтового массива. Таким образом, у вас есть поток значений битов, но это также означает, что вы можете только читать поток от начала до конца, нет произвольного доступа к значениям, как у вас, с байтовыми значениями в байтовом массиве.

2 голосов
/ 02 октября 2009

Что я получу, если письмо А является наиболее частым письмом, используемым в текст, могу ли я использовать 1 бит, чтобы сохранить его что касается сжатия вместо построение двоичного дерева.

Алгоритм, который вы описываете, известен как кодирование Хаффмана . Чтобы обратиться к вашему примеру, если «A» часто появляется в данных, то алгоритм будет представлять «A» как просто 1. Если «B» также появляется часто (но реже, чем A), алгоритм обычно будет представлять «B» 'как 01. Тогда остальные символы будут 00xxxxx ... и т. д.

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

2 голосов
/ 02 октября 2009

Какую кодировку вы бы выбрали?

1 голос
/ 02 октября 2009

Вы можете использовать такие вещи, как:

Convert.ToBytes(1);
ASCII.GetBytes("text");
Unicode.GetBytes("text");

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

0 голосов
/ 02 октября 2009

Строка - это , фактически сохраненная в двоичном формате, как и все строки.

Разница между строкой и другим типом данных заключается в том, что когда ваша программа отображает строку, она получает двоичный файл и отображает соответствующие (ASCII) символы.

Если бы вы хранили данные в сжатом формате, вам нужно было бы назначить более 1 бита на символ. Как еще вы определили бы , какой символ является наиболее частым?

Если 1 представляет «А», что означает 0? все остальные символы?

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