Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/67: Рейтинг темы: голосов - 67, средняя оценка - 5.00
60 / 5 / 3
Регистрация: 01.10.2011
Сообщений: 93
1

Разбить файл на биты

09.02.2012, 17:04. Показов 13336. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Каким образом осуществить разбиение файла на биты, а потом ещё его желательно будет и собрать.
Пока, собственно вопроса по коду нету, нужны лишь направления в правильную сторону.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2012, 17:04
Ответы с готовыми решениями:

Ввести целое число A. Инвертировать все биты с 4 по 8, включая эти биты. Вывести результат
нужна помощь в битовых операциях.Ввести целое число A. Инвертировать все биты с 4 по 8, включая...

... В четных байтах числа в двоичной системе переместить нулевые биты в старшие биты, а в нечетных байтах – в младшие ...
Доброго времени суток всем, столкнулся с проблемой по С++,требуется написать программу: которая...

Как разбить бинарный файл на младшие и старшие биты
Сабж собственнно. Есть бинарный файл(.BIN) Весит он 1024 байта. Его каким-то образом...

Разбить текст на биты
как разбить текст на биты и если очередной бит информации, которую хотим написать равен единице, то...

17
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
09.02.2012, 17:11 2
В общем-то он и так разбит на биты, в двоичном виде храниться же... Читаешь по байту, рассматриваешь в нём биты.
0
144 / 134 / 8
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 17:27 3
Цитата Сообщение от NoMasters Посмотреть сообщение
рассматриваешь в нём биты.
Для этого следует использовать класс std::bitset<>.
1
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
09.02.2012, 18:27 4
cetrael, А Байт на Биты разбивается так
C
1
2
3
4
5
char B, Out[8];
for(i=0; i<8; i++) {
  k = ((B>>i)&1);
  Out[i] = k;
}
Добавлено через 57 секунд
По себе знаю
1
144 / 134 / 8
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 19:35 5
Если писать на простом Си - да, но на C++ следует использовать std::bitset<>.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <bitset>
 
using namespace std;
 
typedef unsigned char byte;
int main()
{
    cout << "Enter a byte [0..255]" << endl;
    unsigned int buffer;
    cin >> buffer; cin.get();
    byte myByte = static_cast<byte>(buffer);
    bitset<8> myBits(myByte);
    cout << "Bits: ";
    for (int i = 0, N = myBits.size(); i < N; ++i)
        cout << myBits[N - i - 1];
    cin.get();
}
2
retmas
09.02.2012, 20:23
  #6

Не по теме:

Цитата Сообщение от Байт Посмотреть сообщение
Байт на Биты разбивается так

По себе знаю
неплохо сказал:D

0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
09.02.2012, 21:08 7
Цитата Сообщение от Сtrl Посмотреть сообщение
но на C++ следует использовать std::bitset<>
Почему это следует? Особенно если учесть, что вариант из поста #4 даже в пересчёте на полезные команды занимает меньшее количество кода
2
144 / 134 / 8
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 21:20 8
Цитата Сообщение от Evg Посмотреть сообщение
Почему это следует? Особенно если учесть, что вариант из поста #4 даже в пересчёте на полезные команды занимает меньшее количество кода
Интересно вы это полезные команды считаете. Если отделить фрагмент, аналогичный коду из сообщения #4, то вот:
C++
1
2
unsigned char myByte;
bitset<8> myBits(myByte);
Теперь сравнение имеет смысл. Добавьте только экономию памяти (ее использование в std::bitset<> оптимизировано), типобезопасность и отсутствие всего того множества проблем, возникающих при работе с массивами. Ня?
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
09.02.2012, 21:25 9
Цитата Сообщение от Сtrl Посмотреть сообщение
поскольку у меня код больше лишь потому, что там целая программа
Специально для тебя написал ведь "даже в пересчёте на полезные команды"

Цитата Сообщение от Сtrl Посмотреть сообщение
Вот теперь сравнение имеет смысл
Нет, сравнение смысла не имеет. Оно будет иметь смысл когда ты к своему коду допишешь процесс извлечения битов из своего bitset'а. А пока твой код эквивалентент Си'шному коду

C
1
2
unsigned char myByte;
unsigned char myBits = myByte;
0
144 / 134 / 8
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 21:30 10
Цитата Сообщение от Evg Посмотреть сообщение
Нет, сравнение смысла не имеет. Оно будет иметь смысл когда ты к своему коду допишешь процесс извлечения битов из своего bitset'а.
С позиции пользователя этот код идентичен (операция индексации). А с точки зрения реализации... Вы что, правда не знаете про инкапсуляцию, или шутите?
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
09.02.2012, 21:39 11
Цитата Сообщение от Сtrl Посмотреть сообщение
Вы что, правда не знаете про инкапсуляцию, или шутите?
Если честно, не понял, при чём тут компиляция в свете спора обязательности использовать bitset

Добавлено через 1 минуту
Цитата Сообщение от Сtrl Посмотреть сообщение
Добавьте только экономию памяти (ее использование в std::bitset<> оптимизировано), типобезопасность и отсутствие всего того множества проблем, возникающих при работе с массивами. Ня?
Вообще мы тут работаем не с массивами а с единичным байтом (ведь вся речь шла о том, что файл читаем побайтно, а затем выдираем из него биты)
0
144 / 134 / 8
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 21:43 12
Цитата Сообщение от Evg Посмотреть сообщение
Если честно, не понял, при чём тут компиляция в свете спора обязательности использовать bitset
Как бы как только вы начали говорить об аналогичном коде на чистом Си - вы полезли в дебри реализации. Да, по сути там выходит вышеуказанное присваивание из char в char, даже дополнительные накладные расходы есть. Но это же черный ящик - какая разница, что внутри? Библиотечный класс предоставляет специальный интерфейс для работы с битами, в отличие от обычного массива char[8].
Цитата Сообщение от Evg Посмотреть сообщение
Вообще мы тут работаем не с массивами а с единичным байтом
С массивами. Или следующая строка такая неброская?
C
1
char B, Out[8]
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
09.02.2012, 22:01 13
Цитата Сообщение от Сtrl Посмотреть сообщение
С массивами. Или следующая строка такая неброская?
Давай возьмём твой пример (отбросив ненужное)

C++
1
2
3
4
byte myByte = ...;
bitset<8> myBits(myByte);
for (i = 0; i < N; i++)
  cout << myBits[N - i - 1];
и приведём к такому же виду вариант на Си

C
1
2
3
unsigned char myByte = ...;
for (i = 0; i < N; i++)
  cout << ((myByte >> i) & 1);
Зачем нам хранить промежуточные значения? Речь ведь не идёт об обработке битов. Речь идёт только о том, чтобы разобрать файл и собрать. Т.е. (условно говоря) читаем из одного файла (или потока) побайтно и пишем в другой файл (или поток) побитно. Либо я не так понял постановку задачи

А если всё-таки нужно хранить в памяти всю информацию о битах, то я как-то в описании bitset'а не нашёл, как, например, создать bitset размером в миллион бит и загнать туда 125 тыщ байт
0
144 / 134 / 8
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 22:14 14
Цитата Сообщение от Evg Посмотреть сообщение
Зачем нам хранить промежуточные значения? Речь ведь не идёт об обработке битов. Речь идёт только о том, чтобы разобрать файл и собрать. Т.е. (условно говоря) читаем из одного файла (или потока) побайтно и пишем в другой файл (или поток) побитно. Либо я не так понял постановку задачи
Мне кажется, что не так, ибо иначе разбиение на биты вообще смысла не имеет. Для обыкновенного вывода на экран я нахожу ваш способ достаточным. Но зачем отказываться от универсальности и гибкости кода, экономя при этом пару байт?
Цитата Сообщение от Evg Посмотреть сообщение
А если всё-таки нужно хранить в памяти всю информацию о битах, то я как-то в описании bitset'а не нашёл, как, например, создать bitset размером в миллион бит и загнать туда 125 тыщ байт
Загнать откуда? Из потока, из массива? В обоих случаях алгоритм тривиален (да прибудет с вами Google).
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
09.02.2012, 22:21 15
Цитата Сообщение от Сtrl Посмотреть сообщение
Но зачем отказываться от универсальности и гибкости кода, экономя при этом пару байт?
Я ж не отказываюсь. Я всего лишь пытаюсь оспорить слово "следует", которое в данном контексте можно трактовать как какую-то обязаловку.

Цитата Сообщение от Сtrl Посмотреть сообщение
Загнать откуда? Из потока, из массива? В обоих случаях алгоритм тривиален
Да пофиг откуда. Из описания я вижу, что заполнять большой bitset можно только побитно, но не побайтно
0
144 / 134 / 8
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 23:00 16
Цитата Сообщение от Evg Посмотреть сообщение
Да пофиг откуда. Из описания я вижу, что заполнять большой bitset можно только побитно, но не побайтно
http://stackoverflow.com/a/5239336
1
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
09.02.2012, 23:05 17
Что-то вот здесь http://cplusplus.com/reference/stl/bitset я не увидел операторов <<= и |=, потому и возник такой вопрос
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
11.02.2012, 16:26 18
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/////////////////////////////////////////////////////////////////////////////////////////
//Каким образом осуществить разбиение файла на биты, а потом ещё его желательно будет и собрать. 
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <bitset>
#include <climits>
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <iostream>
#include <limits>
#include <sstream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string  T_str;
/////////////////////////////////////////////////////////////////////////////////////////
void  bytesfile_to_bitsfile
    (
        const T_str&    bytes_filename,
        const T_str&    bits_filename
    )
{
    std::ifstream   ibytes_file     ( bytes_filename    .c_str(),   std::ios::binary    );
    std::ofstream   obits_file      ( bits_filename     .c_str()                        );
 
    char  byte_symb;
    while( ibytes_file.get(byte_symb) )
    {
        obits_file  <<  std::bitset<CHAR_BIT>(byte_symb).to_string();
    }    
}
/////////////////////////////////////////////////////////////////////////////////////////
void  bitsfile_to_bytesfile
    (
        const T_str&    bits_filename,
        const T_str&    bytes_filename        
    )
{
    std::ifstream   ibits_file      ( bits_filename     .c_str(),   std::ios::binary    );
    std::ofstream   obytes_file     ( bytes_filename    .c_str()                        );
 
    char    bit_symb;
    T_str   byte_str;
    while( ibits_file.get(bit_symb) )
    {
        byte_str += bit_symb;
        if( byte_str.size() == CHAR_BIT )
        {
            char  byte_symb     =   char( std::bitset<CHAR_BIT>(byte_str).to_ulong() );
            obytes_file         <<  byte_symb;
            byte_str.clear();
        }
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
bool  files_compare
    (
        const T_str&    L,
        const T_str&    R
    )
{
    std::ifstream   L_file      ( L.c_str(),    std::ios::binary    );
    std::ifstream   R_file      ( R.c_str(),    std::ios::binary    );
 
    std::ostringstream  L_sout;
    L_sout  <<  L_file.rdbuf();
 
    std::ostringstream  R_sout;
    R_sout  <<  R_file.rdbuf();
 
    return  L_sout.str()    ==  R_sout.str();
}
/////////////////////////////////////////////////////////////////////////////////////////
void  random_fill_file
    ( 
        const T_str&    filename,
        int             symbols_total
    )
{
    std::ofstream   ofile( filename.c_str(),     std::ios::binary    );
    const char  char_min    =   std::numeric_limits<char>::min();
    const char  char_max    =   std::numeric_limits<char>::max();
    
    for(int  i = 0; i < symbols_total; ++i)
    {
        char    rand_symb   =   rand() % (char_max - char_min + 1) + char_min;
        
        if( !iscntrl(rand_symb) )
        {
            ofile.put(rand_symb);
        } 
    }
}
///////////////////////////////////////////////////////////////////////////////////////// 
void  print_file( const T_str&  filename )
{
    std::ifstream   ifile( filename.c_str() );
 
    std::cout   <<  std::endl
                <<  std::endl
                <<  std::endl
                <<  filename                
                <<  ":"
                <<  std::endl
                <<  std::endl
                <<  ifile.rdbuf()
                <<  std::endl
                <<  std::endl;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{    
    srand(unsigned(time(0)));
 
    const T_str     bytes_start_filename    =   "bytes_start.txt";
    const T_str     bits_filename           =   "bits.txt";
    const T_str     bytes_finish_filename   =   "bytes_finish.txt";
 
    const int       BYTES_START_FILE_SIZE   =   100;
    random_fill_file
        (
            bytes_start_filename,
            BYTES_START_FILE_SIZE
        );
    
    bytesfile_to_bitsfile
        (
            bytes_start_filename,
            bits_filename
        );
 
    bitsfile_to_bytesfile
        (
            bits_filename,
            bytes_finish_filename
        );
 
    std::cout   <<  (
                        files_compare
                            (
                                bytes_start_filename,
                                bytes_finish_filename
                            )
                            ? bytes_start_filename + " == " + bytes_finish_filename
                            : bytes_start_filename + " != " + bytes_finish_filename
                    )
 
                <<  std::endl;
 
    print_file( bytes_start_filename    );
    print_file( bits_filename           );
    print_file( bytes_finish_filename   );
}
0
11.02.2012, 16:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2012, 16:26
Помогаю со студенческими работами здесь

В каждом байте числа обнулить 0-ой и 7-ой биты и сделать единичными 3-ий и 4-ый биты
Надо: Прочитать беззнаковое целое число из стандартного потока ввода и в каждом байте числа...

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

Как записать биты в файл, а затем считать их по-одному
Нужно реализовать 2 функции: 1) write_bits берет открытый файл и строку битов как параметр, и...

Как разбить файл на две части, разархивировать и изменить вторую часть, а потом собрать файл обратно?
Здравствуйте! Хочу поднять тему Ципиховича Эндрю (в праве поднять тему отказано: новый вопрос,...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru