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

—++ дл€ начинающих

¬ойти
–егистраци€
¬осстановить пароль
 
–ейтинг: –ейтинг темы: голосов - 9, средн€€ оценка - 4.78
S_hmel
3 / 3 / 0
–егистраци€: 14.02.2012
—ообщений: 82
#1

–абота с файлом в виде двоичного кода - C++

16.04.2012, 13:02. ѕросмотров 1179. ќтветов 14
ћетки нет (¬се метки)

«дравствуйте. ѕродолжаю работу над внедрением в картинку TIFF текстового файла. —обственно говор€, задача є1 - считать текст из файла в последовательность нулей и единиц побайтно. “.е., необходимо, чтобы 0 и 1 были в группах по 8 штук в каждой.

¬от написал код чтени€ из файла с выводом результатов на экран:

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
#include <vcl.h>
#include <stdio.h>
#include <iostream.h>
#pragma hdrstop
 
#include <tchar.h>
//---------------------------------------------------------------------------
 
#pragma argsused
 
FILE *SecretFile;              //указатель на скрываемый файл
FILE *NextFile;                //указатель на сохран€емый файл
BYTE *textbuf;                 //буфер файла
 
unsigned int FILE_SIZE = 0;                        //размер файла
BYTE *bitarray = new BYTE[8];                   //массив дл€ одного байта - 8 элементов (каждый €вл€етс€ битом)
BYTE *bitsbuf;                                         //планировалс€ как массив дл€ всего файла, состо€щий из последовательно помещенных
                                                             //в него массивов bitarray, каждый раз с новыми значени€ми 
BYTE *ByteToBinary (BYTE val);                  //вспомогательные функции
BYTE BinaryToByte (BYTE *mass);
//---------------------------------------------------------------------------
 
void main(int argc, char argv[])
{
  /* ќткрывает файл дл€ чтени€ */
  cout<<"Opening file"<<endl;
  cin.get();
  
//само окрытие
if ((SecretFile = fopen ("c:\\test.txt", "r")) == NULL){
    cout<<"Could not to open file!!!"<<endl;
    cin.get();
  }
else cout<<"Successfully opening"<<endl;
cin.get();
  
//определение размера файла
  fseek(SecretFile, 0, SEEK_END); //узнать конец файла
  FILE_SIZE = ftell (SecretFile); //определить его размер
  fseek(SecretFile, 0, SEEK_SET); //поставить указатель назад
 
  //выделение пам€ти под файл - инициализаци€ массива textbuf
if ((textbuf = (BYTE*) malloc(sizeof(BYTE) * FILE_SIZE )) == NULL){
 cout<<"Failed to malloc for file"<<endl;
  cin.get();
 }
else cout<<"Successfully malloc for file"<<endl;
 cout<<"Filesize is "<<FILE_SIZE<<" bytes";
cin.get();
  
//считать файл в буфер
   size_t count = FILE_SIZE;
   size_t size = 1;
if (fread(textbuf, size, count, SecretFile) != count){   //чтение в буфер байты файла 
  cout<<"Error of reading file!!!"<<endl;
   cin.get();
  }
 
else cout<<"Successfylly reading to memory!!!"<<endl;
cin.get();
unsigned int i = 0;
int j = 0;
 
for (i = 0; i < count; i++) {
 
       bitarray = ByteToBinary (textbuf[i]);              преобразовать данные буфера в биты
       printf ("> Byte %d : <", i);
       for (j = 0; j < 8; j++) {
            printf ("%d", bitarray[j]);
       }
 
      }
   cout<<endl;
 
 
 cout<<endl<<endl;
 cin.get();
 fclose(SecretFile);                              //закрытие исходного файла
}
‘ункци€ разложени€ на биты:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
BYTE *ByteToBinary (BYTE val)
/* –азбивает исходный Ѕайт на биты. ¬озвращает массив из восьми элементов
    аждый Nй элемент соответствует Nму биту.
   ѕринимает значени€ 1 или 0
*/
{           BYTE *mass = new BYTE[8];
            int t, i;
            for (t = 128, i = 0; t > 0; t /= 2, i++)
            {
                if ((val & t) != 0) mass[i] = 1;
                else if ((val & t) == 0) mass[i] = 0;
            }
  return mass;
}
¬ыдает такой результат дл€ текстового файла размером 114 байт (см. вложение).

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

√лавный мой вопрос - как организовать сохранение массива bitarray в больший массив, который будет содержать в себе весь файл в двоичном виде?
ћиниатюры
–абота с файлом в виде двоичного кода  
Similar
Ёксперт
41792 / 34177 / 6122
–егистраци€: 12.04.2006
—ообщений: 57,940
16.04.2012, 13:02     –абота с файлом в виде двоичного кода
ѕосмотрите здесь:

извлечь биты и вывести в виде двоичного кода число на €зыке — - C++
ѕомогите пожалуйста написать программу. суть которой заключаетс€ в том,чтобы извлечь биты и вывести в виде двоичного кода число,вводимое с...

ѕалиндром двоичного кода - C++
ƒл€ введенного с клавиатуры натурального числа n(n&lt;=32000) определить €вл€етс€ ли его запись в двоичной системе счислени€ палиндромом?

–еализаци€ вычитани€ двоичного кода - C++
ƒаны два массива, например 110001 и 11111. Ќе знаю как создать цикл, в частности занимание. dif = A - B + carry; // carry - перенос if...

ѕеревод двоичного кода в текст - C++
«дравствуйте уважаемые форумчане, у мен€ было задание сделать шифратор/дешифратор текста, хот€ в —++ не работал ^_^ ” вас на форуме нашел...

ѕреобразование двоичного кода в текст - C++
есть код: struct home { char name; long number; int dom; int kvartira; };

«апись двоичного кода в блокнот - C++
«дравствуйте, как можно прочитать двоичной код файла, и записать его в блокнот ?

ѕреобразование двоичного кода в ASCII - C++
–еб€та, у мен€ вопрос. ¬от €, например, имею строку &quot;10011001&quot; или подобную из восьми единиц и нулей. ¬опрос: как преобразовать эту строку...

ѕосле регистрации реклама в сообщени€х будет скрыта и будут доступны все возможности форума.
S_hmel
3 / 3 / 0
–егистраци€: 14.02.2012
—ообщений: 82
16.04.2012, 13:55  [“—]     –абота с файлом в виде двоичного кода #2
 ажетс€, € нашел формулу дл€ индекса массива bitsbuf.

C++
1
j+i*8
—ейчас попробую.

ƒобавлено через 8 минут
Ёммм... –езультат странный и смешной.

¬от какие изменени€ € внес:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bitsbuf = new BYTE[FILE_SIZE];
for (i = 0; i < count; i++) {
 
       bitarray = ByteToBinary (textbuf[i]);
       printf ("> Byte %d : <", i);
       for (j = 0; j < 8; j++) {
            printf ("%d", bitarray[j]);
            bitsbuf[j+8*i] = bitarray[j];
       }
 
      }
cout<<"Now we try to write Bits Buffer of file"<<endl;
  for (i = 0; i < count*8; i++) {
     cout<<bitsbuf[i];
  }
 cout<<endl<<endl;
 cin.get();
 fclose(SecretFile);
ќткуда смайлики-то вз€лись я же выделил пам€ть под массив bitsbuf. ћусора не должно быть. », главное, только смайлики)))
ћиниатюры
–абота с файлом в виде двоичного кода  
S_hmel
3 / 3 / 0
–егистраци€: 14.02.2012
—ообщений: 82
16.04.2012, 14:02  [“—]     –абота с файлом в виде двоичного кода #3
ƒальше сделал преобразование строки обратно в файл под названием nexttest.txt:

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
cout<<"Now we try to write same file as nexttest.txt!"<<endl<<endl;
 cout<<"Opening file"<<endl;
  cin.get();
  //само окрытие файла дл€ записи
if ((NextFile = fopen ("c:\\nexttest.txt", "w")) == NULL){
    cout<<"Could not to open next file!!!"<<endl;
    cin.get();
  }
else cout<<"Successfully opening nexttest.txt"<<endl;
cin.get();
 
  //обнуление буфера дл€ файла
if ((textbuf = (BYTE*) malloc(sizeof(BYTE) * FILE_SIZE )) == NULL){
 cout<<"Failed to malloc for file"<<endl;
  cin.get();
 }
else cout<<"Successfully malloc for file"<<endl;
cin.get();
 
 
   for (i = 0; i < count; i++) {
       for (j =0 ; j< count*8; j++) {
         bitarray[j] = bitsbuf[j+i*8];
         textbuf[i] = BinaryToByte(bitarray);
    }
    }
   cout<<"Writing to file..." <<endl;
   if (fwrite(textbuf, size, count, NextFile)!=count) {
   cout<<"Error of writing to file!"<<endl;
   }
  else cout<<"Successfully wrote to file!!!"<<endl;
   cin.get();
    fclose(NextFile);
}
‘ункци€ сбора бит в байт:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
BYTE BinaryToByte (BYTE *mass)
/* —обирает из массива битов один целый байт и возвращает его.
   ¬ходной параметр: массив из восьми элементов, соответсвтующих
   битам Ѕайта
*/
{
            BYTE Mask   = 00000001;
            BYTE Result = 00000000;
            BYTE Mask2;
 
            int j = 0;
            for (int i = 7; i > -1; i--, j++)
            {
              if (mass[i] == 1){
                Mask2 = (Mask << (j));
                Result = Result|Mask2;
                                  }
            }
            return Result;
}
¬от, что получилось в файле:

C++
1
ж°ФзН©ж§*вБ≥ж°івБ•ж•¶`вШАзЙѓзР*зН•ж•іжЭЃжЄ*зЭ•зА*жљ≤зЙІжµ°вАђж°ізС°жМ*жєѓжХґзС≤жШ*汩вБ•жљіжИ*жє©зЙ°жХ©в±≥жД*жСЃзЬ*ж•≤жХіжИ*жє©зЙ°жХ©вБ≥жЕҐж*£жЕЈзЙ≤вБ§жљіжЄ*зЭ•жШ*汩박
ћиниатюры
–абота с файлом в виде двоичного кода  
S_hmel
3 / 3 / 0
–егистраци€: 14.02.2012
—ообщений: 82
16.04.2012, 14:08  [“—]     –абота с файлом в виде двоичного кода #4
 ажетс€, € создал транслитератор из латиницы в упрощенный китайский

ƒобавлено через 2 минуты
 то-нибудь, подскажите, в чем мо€ ошибка)))  огда во второй части программы тупо перебрасывал в файл bitarray[i], получал натуральный последний символ текста в новом файле, хоть на латинице, хоть на кириллице был текст.
S_hmel
3 / 3 / 0
–егистраци€: 14.02.2012
—ообщений: 82
16.04.2012, 15:47  [“—]     –абота с файлом в виде двоичного кода #5
“ааак! ¬от как этот файл выгл€дит в WordPad.
ћиниатюры
–абота с файлом в виде двоичного кода  
DeadRipper
64 / 70 / 3
–егистраци€: 25.06.2009
—ообщений: 244
16.04.2012, 16:13     –абота с файлом в виде двоичного кода #6
÷итата —ообщение от S_hmel ѕосмотреть сообщение
ќткуда смайлики-то вз€лись я же выделил пам€ть под массив bitsbuf. ћусора не должно быть. », главное, только смайлики)))
смайлики по всей видимости это единицы что не равно '1'
советую сделать

C++
1
2
3
4
cout<<"Now we try to write Bits Buffer of file"<<endl;
  for (i = 0; i < count*8; i++) {
     cout<<bitsbuf[i] + '0';   // 1 or 0 + ASCII 0
  }
S_hmel
3 / 3 / 0
–егистраци€: 14.02.2012
—ообщений: 82
16.04.2012, 16:34  [“—]     –абота с файлом в виде двоичного кода #7
÷итата —ообщение от DeadRipper ѕосмотреть сообщение
смайлики по всей видимости это единицы что не равно '1'
советую сделать

C++
1
2
3
4
cout<<"Now we try to write Bits Buffer of file"<<endl;
  for (i = 0; i < count*8; i++) {
     cout<<bitsbuf[i] + '0';   // 1 or 0 + ASCII 0
  }
ѕолучилось вот что:
ћиниатюры
–абота с файлом в виде двоичного кода  
S_hmel
3 / 3 / 0
–егистраци€: 14.02.2012
—ообщений: 82
16.04.2012, 16:36  [“—]     –абота с файлом в виде двоичного кода #8
¬ывод в файл не изменилс€.
DeadRipper
64 / 70 / 3
–егистраци€: 25.06.2009
—ообщений: 244
16.04.2012, 16:46     –абота с файлом в виде двоичного кода #9
C++
1
2
3
4
cout<<"Now we try to write Bits Buffer of file"<<endl;
  for (i = 0; i < count*8; i++) {
     cout<< char(bitsbuf[i] + '0');   // 1 or 0 + ASCII 0
  }
Nekto
342 / 287 / 10
–егистраци€: 23.03.2012
—ообщений: 838
16.04.2012, 16:49     –абота с файлом в виде двоичного кода #10
BinaryToByte точно правильно работает? ј то мудрЄно написано как-то
C++
1
2
3
4
5
6
7
8
9
10
11
BYTE BinaryToByte (BYTE *mass)
{
            BYTE Result=0;
            int t=128;
            for (int i = 0; i < 8; i++)
            {
              if (mass[i] == 1) Result+=t;
              t/=2; 
            }
            return Result;
}
S_hmel
3 / 3 / 0
–егистраци€: 14.02.2012
—ообщений: 82
16.04.2012, 16:50  [“—]     –абота с файлом в виде двоичного кода #11
DeadRipper, браво!!! ќстались, правда, непон€тки с пропускающимис€ символами.
ћиниатюры
–абота с файлом в виде двоичного кода   –абота с файлом в виде двоичного кода  
DeadRipper
64 / 70 / 3
–егистраци€: 25.06.2009
—ообщений: 244
16.04.2012, 16:57     –абота с файлом в виде двоичного кода #12
C++
1
2
3
4
5
6
for (i = 0; i < count; i++) {
       for (j =0 ; j< count*8; j++) {
         bitarray[j] = bitsbuf[j+i*8];
         textbuf[i] = BinaryToByte(bitarray);
    }
    }
¬от тут уж очень странно
если bitarray состоит из 8 элементов, то как цикл может быть до count*8 это будет суд€ по вашему файлу 144*8 элементов

скорее всего будет так
C++
1
2
3
4
5
6
for (i = 0; i < count; i++) {
       for (j =0 ; j< 8; j++) {
         bitarray[j] = bitsbuf[j+i*8];
    }
textbuf[i] = BinaryToByte(bitarray); // это не стоит повтор€ть 8 раз ))
    }
S_hmel
3 / 3 / 0
–егистраци€: 14.02.2012
—ообщений: 82
16.04.2012, 17:10  [“—]     –абота с файлом в виде двоичного кода #13
÷итата —ообщение от DeadRipper ѕосмотреть сообщение
C++
1
2
3
4
5
6
for (i = 0; i < count; i++) {
       for (j =0 ; j< count*8; j++) {
         bitarray[j] = bitsbuf[j+i*8];
         textbuf[i] = BinaryToByte(bitarray);
    }
    }
¬от тут уж очень странно
если bitarray состоит из 8 элементов, то как цикл может быть до count*8 это будет суд€ по вашему файлу 144*8 элементов

скорее всего будет так
C++
1
2
3
4
5
6
for (i = 0; i < count; i++) {
       for (j =0 ; j< 8; j++) {
         bitarray[j] = bitsbuf[j+i*8];
    }
textbuf[i] = BinaryToByte(bitarray); // это не стоит повтор€ть 8 раз ))
    }
ј что тут не так с bitarray? ” него и остаетс€ 8 элементов. ј вот bitsbuf - буфер дл€ всего файла в двоичном представлении. ‘айл 144 байта - в буфер идет 144х8 бит. ‘ормулу дл€ просчета позиций при присвоении bitsbuf текущих значений массива bitarray € вывел вручную, ее же и применил при обратной операции - присваивани€ текущих значений bitsbuf массиву текущего байта bitarray.
S_hmel
3 / 3 / 0
–егистраци€: 14.02.2012
—ообщений: 82
16.04.2012, 17:14  [“—]     –абота с файлом в виде двоичного кода #14
÷итата —ообщение от DeadRipper ѕосмотреть сообщение

скорее всего будет так
C++
1
2
3
4
5
6
for (i = 0; i < count; i++) {
       for (j =0 ; j< 8; j++) {
         bitarray[j] = bitsbuf[j+i*8];
    }
textbuf[i] = BinaryToByte(bitarray); // это не стоит повтор€ть 8 раз ))
    }
¬ывод в файл не мен€етс€ по сути.
ћиниатюры
–абота с файлом в виде двоичного кода  
MoreAnswers
Ёксперт
37091 / 29110 / 5898
–егистраци€: 17.06.2006
—ообщений: 43,301
16.04.2012, 17:17     –абота с файлом в виде двоичного кода
≈ще ссылки по теме:

—оздание файла из двоичного кода - C++
«дравствуйте, у мен€ есть переменна€ типа std::string ¬ ней хранитс€ двоичной код, как мне создать файл (.txt), и записать в него этот...

Ќе могу перевести из двоичного кода в ASCII - C++
≈сть ли в C++ функци€ получени€ кода ASCII по двоичному, и наоборот? »мею массив: char t=;  ак преобразовать данный массив в...

ќсуществить перевод из двоичного кода в дес€тичный - C++
ѕомогите пожалуйста. Ќужно срочно решить несколько задач самым простейшим образом(без библиотек и функций) на уровне 1 курса =) Ќаписать...

јнгло-русский словарь построен в виде двоичного дерева в программе с++ - C++
јнгло-русский словарь построен в виде двоичного дерева.  ажда€ компонента содержит английское слово, соответствующее ему русское слово и...

„астотный словарь из слов текстового файла в виде дерева двоичного поиска - C++
«адача: ѕостроить частотный словарь из слов текстового файла в виде дерева двоичного поиска. ¬ывести его на экран в виде дерева....


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

»ли воспользуйтесь поиском по форуму:
S_hmel
3 / 3 / 0
–егистраци€: 14.02.2012
—ообщений: 82
16.04.2012, 17:17  [“—]     –абота с файлом в виде двоичного кода #15
’от€ замечание верное. Ќо 5 символов куда-то таинственно деваютс€. Ќо в Notepad'е обычном можно смотреть уже в кириллице.
Yandex
ќбъ€влени€
16.04.2012, 17:17     –абота с файлом в виде двоичного кода
ќтвет —оздать тему
ќпции темы

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