Форум программистов, компьютерный форум CyberForum.ru

Биты и байты в алгоритме Хаффмана - C++

Восстановить пароль Регистрация
 
BlindDespair
0 / 0 / 0
Регистрация: 07.12.2013
Сообщений: 18
14.12.2013, 00:54     Биты и байты в алгоритме Хаффмана #1
Пишу программу на С, в которой нужно реализовать метод кодирования Хаффмана. Код не буду прикладывать, так как в нём в принципе для меня всё понятно. В общем читаю я из текстового файла информацию, проходит этап кодировки, хоть и дерево неправильно строится, но меня этот вопрос пока не волнует. Меня вот что волнует: записываю я код из 0 и 1 в бинарный файл, но в нем 0 и 1 почему-то считаются как 1 байт, то есть как символы из ASCII таблицы, а не как 1 бит, что приводит к тому, что бинарный файл, который должен быть сжатым вроде как, становится больше текстового файла, который я кодирую. Так вот вопрос: как сделать так, чтобы 0 и 1 принимались в бинарном файле как 1 бит?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,065
14.12.2013, 00:59     Биты и байты в алгоритме Хаффмана #2
Цитата Сообщение от BlindDespair Посмотреть сообщение
записываю я код из 0 и 1 в бинарный файл, но в нем 0 и 1 почему-то считаются как 1 байт, то есть как символы из ASCII таблицы, а не как 1 бит,
наверно потому что в Си минимальная единица char, она же байт
ни о каких битах он не знает,хотя есть такие диалекты( для микроконтроллеров) которые могут с битами работать, но это уже экзотика
так что упаковывай 8 бит в один unsigned char, или смирись с тем что тебе под 0 и 1 выделяется целый байт
BlindDespair
0 / 0 / 0
Регистрация: 07.12.2013
Сообщений: 18
14.12.2013, 01:01  [ТС]     Биты и байты в алгоритме Хаффмана #3
А можно поподробнее по поводу 8 бит в unsignet char?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,065
14.12.2013, 01:26     Биты и байты в алгоритме Хаффмана #4
Цитата Сообщение от BlindDespair Посмотреть сообщение
А можно поподробнее по поводу 8 бит в unsignet char?
ну например у тебя есть массив 1 и 0( 8 штук)
C++
1
2
3
unsigned char res=0;
for(int i=0;i<8;i++)
 res|=(arr[i]&0x01)<<i;
доставать так, у тебя будет куча char
C++
1
2
3
4
bool fncGet( int bt, unsigned char * arrByte)
 {
  return  (arrByte[bt/8]&(1<<(bt%8)))!=0;
 }
установить отдельный бит так
C++
1
2
3
4
5
6
bool fncSet( int bt, bool val,unsigned char * arrByte)
 {
  arrByte[bt/8]&=~(1<<(bt%8));// обнулим нужный бит
  arrByte[bt/8]|=val<<(bt%8);  // установим новое значение
 
 }
BlindDespair
0 / 0 / 0
Регистрация: 07.12.2013
Сообщений: 18
14.12.2013, 01:29  [ТС]     Биты и байты в алгоритме Хаффмана #5
Спасибо, сейчас попробую разобраться.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,065
14.12.2013, 01:39     Биты и байты в алгоритме Хаффмана #6
Цитата Сообщение от BlindDespair Посмотреть сообщение
Спасибо, сейчас попробую разобраться.
да че там разбираться это на вид только страшное
например у тебя 16 чисел, они займут 2 байта
тебе нужно достать например 11 ( с учетом что первый бит имеет смешение 0 этот будет иметь смешение 10)
значит он лежит во втором байте
10/8=1 ( первый байт как мы помним имеет смещение 0)
теперь какой это бит по порядку?
10%8 =2
берем 1 и сдвигаем влево на 2
1<<2 (0000 0001)<<2 =0000 0100
вот она маска твоего бита делай с ней что хошь
например достать
arrByte[1]&0x04
и если там лежал 0 то получим 0
0!=0 ложь(то бишь 0) его и вернем
если 1
то получим 0x04
0x04!=0 истина(то бишь1) её и вернем
BlindDespair
0 / 0 / 0
Регистрация: 07.12.2013
Сообщений: 18
14.12.2013, 01:59  [ТС]     Биты и байты в алгоритме Хаффмана #7
Извините за, возможно, тупой вопрос, но вот вы используете при записи массива arrByte амперсант и шестнадцатеричную константу, зачем? Что это значит?
gazlan
2867 / 1815 / 272
Регистрация: 27.08.2010
Сообщений: 4,921
Записей в блоге: 1
14.12.2013, 02:02     Биты и байты в алгоритме Хаффмана #8
Посмотрите готовый код у Марка Нельсона (output_code/input_code) в LZW.C
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,065
14.12.2013, 02:07     Биты и байты в алгоритме Хаффмана #9
Цитата Сообщение от BlindDespair Посмотреть сообщение
амперсант и шестнадцатеричную константу, зачем?
в смысле это
Цитата Сообщение от ValeryS Посмотреть сообщение
res|=(arr[i]&0x01)<<i;
для начала 0x01 и 1 это одно и тоже, просто я привык, если работа со сдвигами или с логикой записывать в шеснадцетеричке, она все ближе к двоичке чем десятичная
второе
arr[i]&0x01 это так сказать подстраховка если в массиве будет число не 0 или 1 то наш сдвиг сделает кашу из результата, вот и выделяю младший бит
ну а потом сдвиг и "ИЛИ" с результатом
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2013, 06:09     Биты и байты в алгоритме Хаффмана
Еще ссылки по теме:

Ошибка в алгоритме со строками C++
Биты, байты. Циклически сдвинуть на 4 разряда вправо четное число. C++
C++ Ввести целое число A. Инвертировать все биты с 4 по 8, включая эти биты. Вывести результат

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
BlindDespair
0 / 0 / 0
Регистрация: 07.12.2013
Сообщений: 18
14.12.2013, 06:09  [ТС]     Биты и байты в алгоритме Хаффмана #10
Завтра буду думать на свежую голову тогда. Спасибо за подсказки. Думаю, возникнут ещё вопросы.
Yandex
Объявления
14.12.2013, 06:09     Биты и байты в алгоритме Хаффмана
Ответ Создать тему
Опции темы

Текущее время: 09:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru