powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Класс для работы с файлом на битовом уровне
11 сообщений из 11, страница 1 из 1
Класс для работы с файлом на битовом уровне
    #33398462
Фотография Desil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Существует ли сабж? Или как его ручками написать.
Задача: иметь возможность читать из файла и писать в него по 1 биту.
...
Рейтинг: 0 / 0
Класс для работы с файлом на битовом уровне
    #33398596
Фотография Lelikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бред в постановке задачи.
Все равно ведь читать придется не один бит, с диска читается как минимум кластер, а реально не меньше 64К. Вот и прочтите в буфер, а потом работайте как с битовым массивом.
________________________________________________________
Глюк - это высокоорганизованная система не поддающихся определению частиц
...
Рейтинг: 0 / 0
Класс для работы с файлом на битовом уровне
    #33399220
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно поискать исходники freeware архиваторов. Или примеры
реализации кодеков Хаффмена. Там обязательно должна быть
библиотечка для чтения-записи битов из потока-файла.

Удачи.
...
Рейтинг: 0 / 0
Класс для работы с файлом на битовом уровне
    #33399458
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DesilСуществует ли сабж? Или как его ручками написать.
Задача: иметь возможность читать из файла и писать в него по 1 биту.
Я в институте писал для работы с BW-битмапами. Основной принцип там был такой - имеешь буфер из байтов. Имеешь номер бита который надо установить/сбросить. Результат целочисленного деления номера бита на CHAR_SIZE - это номер байта. Остаток - это номер бита. Если бит надо установить, делаешь маску и накладываешь ее на байт через OR. Если сбросить, делаешь инверсную маску и накладываешь ее на байт через AND. Если надо проверить состояние бита, накладываешь маску через AND и проверяешь на нулевой/ненулевой результат.
Потом я читал Саттера, там такой подход был раскритикован и взамен было рекомменодовано использовать std::bitset.
...
Рейтинг: 0 / 0
Класс для работы с файлом на битовом уровне
    #33399520
Borya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
;Аргументы: <Указатель>,<ПозБита>
;т.е.
;push ПозБита
;push Указатель
BitSet proc
mov eax,[ESP+8]; адрес в eax
xor edx,edx ;подготовка к делению
xor ecx,ecx
mov cl,32
div cx
xchg ax,dx
mov ecx,[ESP+4]
bts [ecx+edx*4],eax ; btr - для ресета, btc - для инверсии
ret 8
BitSet endp

и классы тебе не нужны.
ЗЫ.
...
Рейтинг: 0 / 0
Класс для работы с файлом на битовом уровне
    #33399898
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Borya7;Аргументы: <Указатель>,<ПозБита>
;т.е.
;push ПозБита
;push Указатель
BitSet proc
mov eax,[ESP+8]; адрес в eax
xor edx,edx ;подготовка к делению
xor ecx,ecx
mov cl,32
div cx
xchg ax,dx
mov ecx,[ESP+4]
bts [ecx+edx*4],eax ; btr - для ресета, btc - для инверсии
ret 8
BitSet endp

и классы тебе не нужны.
ЗЫ.

Ну и в чем смысл?
Вот исх. код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void setBit(unsigned char *buff, unsigned __int64 pos, bool val) {	
	const size_t offset = static_cast<size_t>(pos >>  3 );	
	if (val) {
		*(buff + offset) |=  1  << (pos & 0x7);
	} else {
		*(buff + offset) &= ~( 1  << (pos & 0x7));
	}
}


Вот что нагенерировал компилятор VC7. По-моему неплохо учитывая то что возможности у функции шире.

PUBLIC ?setBit@@YAXPAE_K_N@Z ; setBit
_TEXT SEGMENT
_buff$ = 8 ; size = 4
_pos$ = 12 ; size = 8
_val$ = 20 ; size = 1
?setBit@@YAXPAE_K_N@Z PROC NEAR ; setBit, COMDAT
mov ecx, DWORD PTR _pos$[esp-4]
mov edx, DWORD PTR _pos$[esp]
mov eax, ecx
shrd eax, edx, 3
shr edx, 3
mov dl, BYTE PTR _val$[esp-4]
and ecx, 7
push esi
mov esi, DWORD PTR _buff$[esp]
test dl, dl
mov dl, 1
je SHORT $L81404
shl dl, cl
or BYTE PTR [eax+esi], dl
pop esi
ret 0
$L81404:
shl dl, cl
mov cl, BYTE PTR [eax+esi]
not dl
and cl, dl
mov BYTE PTR [eax+esi], cl
pop esi
ret 0
...
Рейтинг: 0 / 0
Класс для работы с файлом на битовом уровне
    #33401385
Borya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Ильич,
вы не поняли в чем смысл? Да это же то, что вы сами говорили, это то что мы все делали в институте. Просто OR, AND заменил другими инструкциями. Функцию не обязательно делать универсальной, она и так маленькая, просто нужно иметь отдельную функцию для снятия бита.
...
Рейтинг: 0 / 0
Класс для работы с файлом на битовом уровне
    #33402133
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Borya7Сергей Ильич,
вы не поняли в чем смысл? Да это же то, что вы сами говорили, это то что мы все делали в институте.
Какой смысл это делать на ассемблере?
...
Рейтинг: 0 / 0
Класс для работы с файлом на битовом уровне
    #33402369
Borya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А кто сказал что в Сиях нет встроенного ассемблера?
...
Рейтинг: 0 / 0
Класс для работы с файлом на битовом уровне
    #33403907
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Borya7А кто сказал что в Сиях нет встроенного ассемблера?
Ассемблер может и есть, но вопрос был - зачем его использовать?
...
Рейтинг: 0 / 0
Класс для работы с файлом на битовом уровне
    #33405031
Borya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я не настаиваю, это лишь вариант из N решении.
Главное - есть решение, какое из них выбрать дело вкуса.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Класс для работы с файлом на битовом уровне
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]