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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
mishkazzz
0 / 0 / 0
Регистрация: 05.11.2013
Сообщений: 34
#1

Упаковка std :: vector <bool> в байты - C++

21.05.2014, 01:55. Просмотров 724. Ответов 14
Метки нет (Все метки)

Добрый Вечер!

возникла проблема:
нужно элементы
C++
1
std::vector<bool>
упаковать в байты для последующей записи в файл

собственно, вопроса два:
1. как это сделать?
2. как потом нужно поступить с файлом (какие функции использовать и открывать ли файл в бинарном режиме для этого?)

ps по форуму порылся, нашел обширные ответы только для bitset, а, насколько я понимаю, у vector немного другие возможности

заранее спасибо за помощь!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2014, 01:55     Упаковка std :: vector <bool> в байты
Посмотрите здесь:

C++ vector<bool> утверждение
C++ vector<vector <bool> >
Как в vector поместить double, bool? C++
C++ std::vector
C++ Упаковка в байты
Ребята есть ли метод vector <bool> записать в бинарный файл? C++
C++ bool vector
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
21.05.2014, 02:41     Упаковка std :: vector <bool> в байты #2
mishkazzz, создаешь std::vecot<std::bitset<32>> и скидываешь туда все флаги.

http://en.cppreference.com/w/cpp/utility/bitset в качестве доки

Добавлено через 1 минуту
Для записи удобно конвертировать в uint_t и его записывать в бинарный файл.
mishkazzz
0 / 0 / 0
Регистрация: 05.11.2013
Сообщений: 34
21.05.2014, 02:47  [ТС]     Упаковка std :: vector <bool> в байты #3
outoftime,

хм,
vecot - это vector или что-то иное

и если vector, то
а "скинуть флаги" можно просто функцией swap или как?
и почему размер bitset'а 32?

спасибо за ответ!
nmcf
4944 / 4282 / 1431
Регистрация: 14.04.2014
Сообщений: 16,801
21.05.2014, 09:39     Упаковка std :: vector <bool> в байты #4
Много в vector<bool> элементов? Выводи их просто последовательно в файл. Так же считывай.
mishkazzz
0 / 0 / 0
Регистрация: 05.11.2013
Сообщений: 34
21.05.2014, 11:29  [ТС]     Упаковка std :: vector <bool> в байты #5
nmcf, ну заранее неизвестно, сколько там элементов

мне необходимо именно упаковать в байты, а потом вывести в бинарный файл, дабы сжать объем
а вот если выводить в файл, мне кажется под них выделится опять бОльший объем
и я так думаю, что std::vector<std::bitset<32>> тоже потеряет свойство сжимать объем

можно ли каким-нибудь способом просто собрать байт из битов, именно взять и проставить в нем нужные биты внутри?

спасибо!
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
21.05.2014, 11:30     Упаковка std :: vector <bool> в байты #6
Цитата Сообщение от mishkazzz Посмотреть сообщение
и почему размер bitset'а 32?
Кол тебе за невнимательность.

Conversions

to_string

returns a string representation of the data
(public member function)

to_ulong


returns an unsigned long integer representation of the data
(public member function)

to_ullong

returns an unsigned long long integer representation of the data
(public member function)
to_ulong это к 32 битному число, т.е. можно делать битсет который записывается в файл минимум 32 битами.

В твоем случае, лучше использовать http://www.boost.org/doc/libs/1_55_0...ic_bitset.html

Вывод: есть 3 способа:
- использовать std::bitset
- boost::dinamic_bitset
- использовать char для представления каждого бита, т.к. байт - минимальная единица которую можно записать в файл, сокет и т.д., на плюсах.
newbie666
Заблокирован
21.05.2014, 11:48     Упаковка std :: vector <bool> в байты #7
а размер чего ты хочешь уменьшить? размер файла? Что на каждый байт было по 8 значений bool - а ?
mishkazzz
0 / 0 / 0
Регистрация: 05.11.2013
Сообщений: 34
21.05.2014, 11:52  [ТС]     Упаковка std :: vector <bool> в байты #8
outoftime, да, про 32 понял, сейчас прочитаю то, что вы кинули
newbie666, мне нужно закодировать последовательность 0 и 1 5-битными кодами

и вот нужно реализовать именно то, что вы написали - чтобы 1 байт содержал в себе 8 значений bool по сути
newbie666
Заблокирован
21.05.2014, 11:56     Упаковка std :: vector <bool> в байты #9
Цитата Сообщение от mishkazzz Посмотреть сообщение
5-битными кодами
а почему 5-и битными а не 1- битными? Ведь для BOOL Достаточно одного бита - то есть значение 0 или 1 ...
nmcf
4944 / 4282 / 1431
Регистрация: 14.04.2014
Сообщений: 16,801
21.05.2014, 12:00     Упаковка std :: vector <bool> в байты #10
Ну упаковывай тогда по 8 элементов из vector в байт сдвигом и "или", потом записывай в файл.
newbie666
Заблокирован
21.05.2014, 12:13     Упаковка std :: vector <bool> в байты #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
держи! Но тут как бы кол-во булов в векторе должно быть кратно степени двойки... Чтоб было не кратно - надо доработать обработку не полного байта последнего и писать в начало файла общее кол-во булов для последующего чтения...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <tchar.h>
#include <fstream>
#include <vector>
#include <bitset>
 
int _tmain(int argc, _TCHAR* argv[])
{
    const int dataSize = 65536;
    std::vector<bool> data;
    data.reserve(dataSize);
    for(int i = 0; i < dataSize; i++)
        data.push_back(rand()%2-1);
 
    std::fstream fs(L"bool.pak", std::ios::out | std::ios::binary);
    if(fs.is_open())
    {
        for(int i = 0; i < data.size(); i += 8)
        {
            std::bitset<8> bitByte;         
            for(int j = 0; j < 8; j++)
                bitByte[j] = data[i+ j];
            char oneByte = bitByte.to_ulong();
            fs.write(&oneByte, 1);          
        }
        fs.close();
    }
    
    return 0;
}
mishkazzz
0 / 0 / 0
Регистрация: 05.11.2013
Сообщений: 34
21.05.2014, 12:23  [ТС]     Упаковка std :: vector <bool> в байты #12
newbie666, ого! Спасибо вам огромное
Вот только вопрос, У меня в проге размер vector кратен 8, подойдет ведь?
newbie666
Заблокирован
21.05.2014, 12:30     Упаковка std :: vector <bool> в байты #13
Цитата Сообщение от mishkazzz Посмотреть сообщение
У меня в проге размер vector кратен 8, подойдет ведь?
подойдёт, только в рамках моего кода постом выше размер вектора не должен быть меньше 8-и, а так - если он кратен 8-и и больше 8-и - то всё будет работать. Ну сам посмотри, я там просто кол-во итераций циклов захардкодил... Конечно можно сделать на любой размер вектора - но это надо будет ещё погемороиться ...

Добавлено через 3 минуты
да и ещё, если вектор огромный, то писать в файл по одному байту, собственно как и читать из файла по одному байте - крайне не эффективно, следует собрать всё в байтовый массив и одной операцией записи захреначить в файл (так же и читать)
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
21.05.2014, 13:16     Упаковка std :: vector <bool> в байты #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
newbie666, mishkazzz, не спешите господа.

Если нужно только 8 бит использовать, но можно либо создать свой тип либо класс для этого. Доступ к битам осуществляется как и у вектора, так что логику не поломает.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <bitset>
 
typedef std::bitset<8> byte1;
 
class byte2 : public std::bitset<8> {
public:
    uint8_t getByte() const {
        return static_cast<uint8_t>(this->to_ulong());
    }
};
 
int main () {
    byte1 b1;
    byte2 b2;
    b1[7] = true;
    b2[7] = true;
    std::cout << static_cast<uint8_t>(b1.to_ulong()) << ' ' << b2.getByte() << '\n';
}
Только с классом можно сразу определить методы ввода\вывода в файл или поток.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2014, 19:45     Упаковка std :: vector <bool> в байты
Еще ссылки по теме:

C++ Std::vector
C++ Ошибка при использовании vector<bool>
Выбор значения для шаблона, bool отделить от std::is_integral C++
Vector<bool> и visual c++ C++
C++ Примерная реализация std vector bool

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

Или воспользуйтесь поиском по форуму:
mishkazzz
0 / 0 / 0
Регистрация: 05.11.2013
Сообщений: 34
21.05.2014, 19:45  [ТС]     Упаковка std :: vector <bool> в байты #15
Спасибо всем огромное за помощь!

программу написал
то, что требует задача, она выполняет

однако работает ооочень долго, но это не беда
удачи!
Yandex
Объявления
21.05.2014, 19:45     Упаковка std :: vector <bool> в байты
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru