Я пытаюсь реализовать алгоритм сжатия, и для этого мне нужно иметь массив однобайтовых кодов символов - они должны быть одиночными байтами. Я не знаком с тем, как обращаться с кодами символов в программировании, но в требованиях они должны быть однобайтными, а также не зависимыми от ОС/машин. Это так же просто, как целые значения от 0 до 255?
Я использовал следующий небольшой фрагмент, чтобы узнать, какие символы доступны мне, если это так:
for (int i = 0; i < 256; i++) {
std::cout << (char)i << std::endl;
}
Кажется, что многие из первых чисел являются пустыми символами, невидимыми, и последний набор отображается как?
РЕДАКТИРОВАТЬ:
Более конкретно, я пытаюсь реализовать аналогичный алгоритм для этой статьи. Он прерывает последовательность ДНК в сегменты из 4 и преобразует их с помощью хеш-таблицы, поэтому, например, AAAA преобразуется в символ, кодируемый одним байтовым символом, AAAT преобразуется в один байт-символ. Для ДНК 4 байта в 1 байт довольно хорошее сжатие (хотя, если я хочу расширить алфавит от A, T, C, G до A, T, C, G, N и - мне понадобится 6 ^ 4 символа из 256, необходимых для 4-буквенного алфавита. Я мог бы уменьшить сжатие с 4 в 1 до 3 в одном, и только 216 однобайтовых кодов символов.
Это сжатие является частью того, что я пытаюсь написать, который должен читаться последовательностями из нескольких последовательностей последовательности (последовательности/строки из 6 буквенных алфавитов A, T, C, G, N и -), которые могут быть очень большими. И удалите все неинформативные для моей программы анализа. Я планирую сделать это, максимально сжав последовательность, затем найдя неинформативный материал в сжатом представлении, а затем расширив оставшийся материал, а затем сделаю вторую развертку и избавлюсь от оставшихся неинформативных материалов в несжатом представлении, прежде снова сжимая оставшиеся информативные материалы при подготовке к аналитической программе.
Возможно, есть лучшие схемы, чем схема хэша, я слышал о чем-то, называемом базовой схемой, о которой мне нужно прочитать. Я также подумал, что, возможно, после того, как строка ДНК будет сжата до 256 однобайтовых форматов, может ли она быть сжата с помощью методов, используемых для сжатия обычного текста?
Некоторые коды ASCII не подлежат печати. Используйте isprint()
чтобы проверить, isprint()
ли символ.
Также стоит отметить, какая кодировка используется вашей оболочкой. В современных настройках используется UTF-8, поэтому, если вы пытаетесь распечатать расширенные коды ASCII, они могут быть интерпретированы (некорректно) в виде многобайтовых UTF-8 последовательностей вместо ASCII при выводе на терминал.
Если вы работаете над алгоритмами, которые работают с двоичными данными, такими как сжатие, вам лучше не обращать внимания на кодировки символов. Избегайте интерпретации данных в виде строк в терминале и рассматривайте его как последовательность целых чисел 0-255. Данные трубы в hexdump
или печатать целочисленные значения каждого байта при отладке.
Есть несколько наборов символов. Если вам нужен одиночный байт -guaranteed single byte-, вам нужен набор символов ASCII. Вы можете использовать определенную кодовую страницу, если хотите поддерживать неанглийский язык, но вам придется решить, какой из них.
Также обратите внимание, что вы можете вычислять с char (который является 8 бит, подписанным) и байтом (который является 8 бит, без знака).
Вот список персонажей и их интерпретация: http://en.wikipedia.org/wiki/ASCII
Наборы символов определенно зависят от ОС. Я бы посоветовал вам работать с UTF-8 и знать, что-почти - вы получите одиночные байты символов.
PS Если вы сжимаете файлы, зачем вам все равно? Чтение файла byte- по байтам (или char-by-char) и воспроизведение тех же байтов/символов на другой стороне, безусловно, будет работать.
(unsigned char) i
, не то чтобы это имело большое значение, так как первые 128 все равно печатались