Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
delexa
2 / 2 / 1
Регистрация: 02.03.2011
Сообщений: 134
#1

Закодировать файл. Взять 7 байт. Первый бит каждого байта переместить в 8 байт - C++

14.03.2014, 03:32. Просмотров 636. Ответов 4
Метки нет (Все метки)

Нужно открыть бинарный файл и закодировать следующим образом. Взять 7 байт. Первый бит каждого байта переместить в 8 байт. То есть, например:
10101010
01010110
00001100
00011000
00011000
00000111
00011100
Нужно превратить в:
0101010
1010110
0001100
0011000
0011000
0000111
0011100
1000000

И так до конца файла.
Написать две программы. Одна - шифрует таким образом, другая - расшифровывает.

Программа, которая шифрует
Кликните здесь для просмотра всего текста
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
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
#include <stdlib.h>
#include <fstream>
 
 
using namespace std;
 
int dvoich (int chislo);
int decyatich (string chislo);
 
 
int main()
{   
    setlocale(0,"");
    char b;
    vector<unsigned int> s;
 
    ifstream f("input.bin", ios::binary| ios::out);
    while(!f.eof())
    {
        f.get(b);
        unsigned char z=static_cast <unsigned char > (b);
        s.push_back(z);
    }
 
    f.close();
 
    vector <string> kod;
    vector <string> poluch_kod;
    string l, k;
 
    ofstream z("output.bin", ios::binary | ios::out);
    z.close();
 
    for (int i=0; i<s.size(); i++)
        kod.push_back ( to_string (  dvoich (  s[i] ) ) ); // запись в переменную код даоичное представление кода
 
    for (int i=0; i<kod.size(); i++ )                // добавляю нули в началоЮ чтобы в каждой стороке было в 8 цифр
    {
        if (kod[i].size()!=8) 
        {
            int kolvo_dobavit=8-kod[i].size();
            string q="";
            for (int j=0; j<kolvo_dobavit; j++ )
                q.append("0");
            kod[i].insert(0,q);
        }
    }
 
    if ((kod.size ()%7!=0))                     //добавление нулей если не кратно 7
    { 
        int kolvo_dobavit= 7-(kod.size ()%7);
        for (int i=0; i<kolvo_dobavit; i++)
            kod.push_back("00000000");
    }
 
    while ( kod.size ()>0 )         // делаю преобразование по заданию
    {
        for (int i=0; i<7; i++)     // читаю по 7 элементов, записываю первые элементы в k, удаляю элементы 
        {
            string z="";
            z=kod[i];
            k.push_back(z[0]);
            kod[i].erase (0,1);
        }
 
        for (int j=0; j<7; j++)           // добавляю в полученный код первые 7 строчек без первого элемента
            poluch_kod.push_back(kod[j]);
 
        poluch_kod.push_back(k);        // добавляю 8 строкой строку к из первых символов 7 строк       
 
        kod.erase (kod.begin(),kod.begin()+7); // удаляю первые 7 элементов 
 
        k="";                                // очищаю к
 
        for (int i=0; i<8; i++)      // вывожу полученный вектор
        {
            ofstream q ("output.bin", ios::binary| ios::out | ios::app);
            q<<static_cast <unsigned char> (decyatich ( poluch_kod[i]));
            q.close();
        }
 
        poluch_kod.clear();           //очищаю полученный вектор
    }
 
 
    return 0;
}
 
int dvoich(int x1)   
{ 
    if (x1<0) x1=-x1;
 
    int i, b;  
    long c = 0;  
    for(i=0; x1 > 0; i++)  
    {
        b = x1 % 2;  
        x1 = (x1-b)/2;
        c += b * pow(10,i);
    }
    return c; }
 
int decyatich (string chislo)
{
    int lentxt=chislo.size();
    int k=0;
    double s=0;
    for (int i=lentxt-1; i>=0; i--)        //умножаем коэфициенты и выводим ответ
    {
        if (chislo[i]=='1')
            s=(int) s+pow(2.0,k);
        k++;
    }
    return s;
}


Программа, которая расшифровывает
Кликните здесь для просмотра всего текста
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
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
#include <stdlib.h>
#include <fstream>
 
using namespace std;
 
int dvoich (int chislo);
int decyatich (string chislo);
 
 
int main()
{
    setlocale(0,"");
 
    char b;
    vector<int> s;
 
    ifstream f("output.bin", ios::binary | ios::out);
    while(!f.eof())
    {
        f.get(b);
        unsigned char z=static_cast <unsigned char > (b);
        s.push_back(z);
    }
 
    f.close();
 
    vector <string> kod;
    vector <string> poluch_kod;
    string l, k;
 
    ofstream z("output1.bin", ios::binary | ios::out);
    z.close();
 
    for (int i=0; i<s.size(); i++)
        kod.push_back ( to_string (  dvoich (  s[i] ) ) ); // запись в переменную код даоичное представление кода
 
    for (int i=0; i<kod.size(); i++ )                // добавляю нули в началоЮ чтобы в каждой стороке было по 7 цифр
    {
        if (kod[i].size()!=7) 
        {
            int kolvo_dobavit=7-kod[i].size();
            string q="";
            for (int j=0; j<kolvo_dobavit; j++ )
                q.append("0");
            kod[i].insert(0,q);
        }
    }
 
    while ( kod.size ()-1!=0 )         // делаю обратное преобразование по заданию
    {
        string z="";                   // беру 8 строк. из них беру последнюю и вставляю первые цифры на первое место в 7 строках
        z=kod[7];
 
        for (int i=0; i<7; i++)     
        {
            char z1=z[i];
            kod[i].insert(0, to_string (z1));
        }
 
        for (int i=0; i<7; i++)
        {
            ofstream q ("output1.bin", ios::binary| ios::out | ios::app);
            if (static_cast <unsigned char> (decyatich ( kod[i])))
                q<<static_cast <unsigned char> (decyatich ( kod[i]));
            q.close();
        }
        // вывожу в файл полученный код
 
        kod.erase (kod.begin(),kod.begin()+8);   // удаляю первые 8 элементов 
    }
 
 
 
 
 
 
 
    return 0;
}
 
int dvoich(int x1)   
{ 
    if (x1<0) x1=-x1;
 
    int i, b;  
    long c = 0;  
    for(i=0; x1 > 0; i++)  
    {
        b = x1 % 2;  
        x1 = (x1-b)/2;
        c += b * pow(10,i);
    }
    return c; }
 
int decyatich (string chislo)
{
    int lentxt=chislo.size();
    int k=0;
    double s=0;
    for (int i=lentxt-1; i>=0; i--)        //умножаем коэфициенты и выводим ответ
    {
        if (chislo[i]=='1')
            s=(int) s+pow(2.0,k);
        k++;
    }
    return s;
}


При вводе в начальный файл русских букв, а затем попытки расшифровки, файл расшифровывается неправильно. Что исправить?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2014, 03:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Закодировать файл. Взять 7 байт. Первый бит каждого байта переместить в 8 байт (C++):

Для целого числа А выделить старший байт и поставить его на место младшего байта. старший байт при этом обнулить. - C++
Помогите пожалуйста, вообще не могу понять как делать следующее...Еще и в программе CODE BLOCKS препод почему именно эту программу...

Удалить из каждого байта строки первый (старший) бит. - C++
Здравствуйте. Суть задачи в общем-то и отображена в названии задачи. Есть строка: unsigned char str; Необходимо в каждом...

Перемещение содержимого из одного байта в другой байт - C++
Здравствуйте все. Есть char A=3; char B=0; Как переместить физическое содержание битов из байта A в байт В, чтобы стало ...

Представление из бит в байт - C++
Вообще такая беда как представить биты в то что они были сначала,вот так я представляю байт в битах с помощью маски,а как обратно не знаю ...

Как прочитать несколько байтов в файле с n-го байта по m-й байт ? - C++
Как прочитать несколько байтов в файле с n-го байта по m-й байт ?

Порядок байт в слове и бит в байте - C++
читал эту требуются пояснения. A B C D - адреса в них число 128 BE A B C D ...

4
mymedia
193 / 193 / 48
Регистрация: 27.05.2011
Сообщений: 544
14.03.2014, 14:26 #2
Мне кажется, или у тебя при кодировании ты записываешь в файл только семь строк вместо восьми на 71-72 строках первой программы, а при раскодировании 57 строка? Или я ошибаюсь? Честно не проверял

Добавлено через 42 секунды
Может где ещё ошибки...
0
delexa
2 / 2 / 1
Регистрация: 02.03.2011
Сообщений: 134
14.03.2014, 15:43  [ТС] #3
mymedia, в 74 строке добавляю 8 строку. Мне кажется ошибка в кодировке. Может нужно как то по другому считать код русских букв?

Добавлено через 12 минут
А в 57 строке я беру 8 символ, чтобы дальше добавлять из него на начало каждому предыдущему символу бит.

Добавлено через 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
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
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
#include <stdlib.h>
#include <fstream>
 
 
using namespace std;
 
int dvoich (int chislo);
int decyatich (string chislo);
 
 
int main()
{   
    setlocale(0,"");
    vector<int> s;
 
    ifstream f("input.bin", /*ios::binary|*/ ios::out);
    while(!f.eof())
    {
        char z; 
        f.get(z);
        if (f.eof()) break;
        s.push_back(static_cast <unsigned char> (z));
    }
 
 
    f.close();
 
    vector <string> kod;
    vector <string> poluch_kod;
    string l, k;
 
    ofstream z("output.bin", /*ios::binary|*/ ios::out);
    z.close();
 
    for (int i=0; i<s.size(); i++)
        kod.push_back ( to_string (  dvoich (  s[i] ) ) ); // запись в переменную код даоичное представление кода
 
    for (int i=0; i<kod.size(); i++ )                // добавляю нули в началоЮ чтобы в каждой стороке было в 8 цифр
    {
        if (kod[i].size()!=8) 
        {
            int kolvo_dobavit=8-kod[i].size();
            string q="";
            for (int j=0; j<kolvo_dobavit; j++ )
                q.append("0");
            kod[i].insert(0,q);
        }
    }
 
    if ((kod.size ()%7!=0))                     //добавление нулей если не кратно 7
    { 
        int kolvo_dobavit= 7-(kod.size ()%7);
        for (int i=0; i<kolvo_dobavit; i++)
            kod.push_back("00000000");
    }
 
    while ( kod.size ()>0 )         // делаю преобразование по заданию
    {
        for (int i=0; i<7; i++)     // читаю по 7 элементов, записываю первые элементы в k, удаляю элементы 
        {
            string z="";
            z=kod[i];
            k.push_back(z[0]);
            kod[i].erase (0,1);
        }
 
        for (int j=0; j<7; j++)           // добавляю в полученный код первые 7 строчек без первого элемента
            poluch_kod.push_back(kod[j]);
 
        poluch_kod.push_back(k);        // добавляю 8 строкой строку к из первых символов 7 строк       
 
        kod.erase (kod.begin(),kod.begin()+7); // удаляю первые 7 элементов 
 
        k="";                                // очищаю к
 
        for (int y=0; y<8; y++)      // вывожу полученный вектор
        {
            ofstream q ("output.bin", /*ios::binary|*/ ios::out | ios::app);
            q<<static_cast <unsigned char> (decyatich ( poluch_kod[y]));
            q.close();
        }
 
        poluch_kod.clear();           //очищаю полученный вектор
    }
 
 
    return 0;
}
 
int dvoich(int x1)   
{ 
    if (x1<0) x1=-x1;
 
    int i, b;  
    long c = 0;  
    for(i=0; x1 > 0; i++)  
    {
        b = x1 % 2;  
        x1 = (x1-b)/2;
        c += b * pow(10,i);
    }
    return c; }
 
int decyatich (string chislo)
{
    int lentxt=chislo.size();
    int k=0;
    double s=0;
    for (int i=lentxt-1; i>=0; i--)        //умножаем коэфициенты и выводим ответ
    {
        if (chislo[i]=='1')
            s=(int) s+pow(2.0,k);
        k++;
    }
    return s;
}


Рашифрование
Кликните здесь для просмотра всего текста
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
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
#include <stdlib.h>
#include <fstream>
 
using namespace std;
 
int dvoich (int chislo);
int decyatich (string chislo);
 
 
int main()
{
    setlocale(0,"");
    vector<int> s;
 
    ifstream f("output.bin", /*ios::binary|*/  ios::out);
    while(!f.eof())
    {
        char z; 
        f.get(z);
        if (f.eof()) break;
        s.push_back(static_cast <unsigned char> (z));
    }
 
    f.close();
 
    vector <string> kod;
    vector <string> poluch_kod;
    string l, k;
 
    ofstream z("output1.bin", /*ios::binary|*/  ios::out);
    z.close();
 
    for (int i=0; i<s.size(); i++)
        kod.push_back ( to_string (  dvoich (  s[i] ) ) ); // запись в переменную код даоичное представление кода
 
    for (int i=0; i<kod.size(); i++ )                // добавляю нули в началоЮ чтобы в каждой стороке было по 7 цифр
    {
        if (kod[i].size()!=7) 
        {
            int kolvo_dobavit=7-kod[i].size();
            string q="";
            for (int j=0; j<kolvo_dobavit; j++ )
                q.append("0");
            kod[i].insert(0,q);
        }
    }
 
    while ( kod.size ()!=0 )         // делаю обратное преобразование по заданию
    {
        string z="";                   // беру 8 строк. из них беру последнюю и вставляю первые цифры на первое место в 7 строках
        z=kod[7];
 
        for (int e=0; e<7; e++)     
        {
            char z1=z[e];
            kod[e].insert(0, to_string (z1));
        }
 
        for (int f=0; f<7; f++)
        {
            ofstream q ("output1.bin", /*ios::binary|*/ ios::out | ios::app);
            if (static_cast <unsigned char> (decyatich ( kod[f])))
                q<<static_cast <unsigned char> (decyatich ( kod[f]));
            q.close();
        }
        // вывожу в файл полученный код
 
        kod.erase (kod.begin(),kod.begin()+8);   // удаляю первые 8 элементов 
    }
    return 0;
}
 
int dvoich(int x1)   
{ 
    if (x1<0) x1=-x1;
 
    int i, b;  
    long c = 0;  
    for(i=0; x1 > 0; i++)  
    {
        b = x1 % 2;  
        x1 = (x1-b)/2;
        c += b * pow(10,i);
    }
    return c; }
 
int decyatich (string chislo)
{
    int lentxt=chislo.size();
    int k=0;
    double s=0;
    for (int i=lentxt-1; i>=0; i--)        //умножаем коэфициенты и выводим ответ
    {
        if (chislo[i]=='1')
            s=(int) s+pow(2.0,k);
        k++;
    }
    return s;
}


Пример работы 1:
Кликните здесь для просмотра всего текста

input.bin
Bjarne Stroustrup, a Danish and British trained computer scientist, began his work on C++'s predecessor "C with Classes" in 1979.[7] The motivation for creating a new language originated from Stroustrup's experience in programming for his Ph.D. thesis. Stroustrup found that Simula had features that were very helpful for large software development, but the language was too slow for practical use, while BCPL was fast but too low-level to be suitable for large software development. When Stroustrup started working in AT&T Bell Labs, he had the problem of analyzing the UNIX kernel with respect to distributed computing. Remembering his Ph.D. experience, Stroustrup set out to enhance the C language with Simula-like features.[9] C was chosen because it was general-purpose, fast, portable and widely used. Besides C and Simula's influences, other languages also influenced C++, for example, ALGOL 68, Ada, CLU and ML. At first, the class, derived class, strong typing, inlining, and default argument features were added to C via Stroustrup's "C with Classes" to C compiler, Cpre.[10]

output.bin
Bjarne Stroust rup, a Danish and Bri tish tr ained c omputer scient ist, be gan his work o n C++'s predec essor " C with Classes " in 19 79.[7] The mot ivation for cr eating a new l anguage origin ated fr om Stro ustrup' s exper ience i n progr amming for his Ph.D. thesis. Strous trup fo und tha t Simul a had f eatures that w ere ver y helpf ul for large s oftware develo pment, but the langua ge was too slo w for p ractica l use, while B CPL was fast b ut too low-lev el to b e suita ble for large softwar e devel opment. When S troustr up star ted wor king in AT&T B ell Lab s, he h ad the problem of ana lyzing the UNI X kerne l with respect to dis tribute d compu ting. R emember ing his Ph.D. experie nce, St roustru p set o ut to e nhance the C l anguage with S imula-l ike fea tures.[ 9] C wa s chose n becau se it w as gene ral-pur pose, f ast, po rtable and wid ely use d. Besi des C a nd Simu la's in fluence s, othe r langu ages al so infl uenced C++, fo r examp le, ALG OL 68, Ada, CL U and M L. At f irst, t he clas s, deri ved cla ss, str ong typ ing, in lining, and de fault a rgument featur es were added to C vi a Strou strup's "C wit h Class es" to C compi ler, Cp re.[10]

output1.bin
Bjarne Stroustrup, a Danish and British trained computer scientist, began his work on C++'s predecessor "C with Classes" in 1979.[7] The motivation for creating a new language originated from Stroustrup's experience in programming for his Ph.D. thesis. Stroustrup found that Simula had features that were very helpful for large software development, but the language was too slow for practical use, while BCPL was fast but too low-level to be suitable for large software development. When Stroustrup started working in AT&T Bell Labs, he had the problem of analyzing the UNIX kernel with respect to distributed computing. Remembering his Ph.D. experience, Stroustrup set out to enhance the C language with Simula-like features.[9] C was chosen because it was general-purpose, fast, portable and widely used. Besides C and Simula's influences, other languages also influenced C++, for example, ALGOL 68, Ada, CLU and ML. At first, the class, derived class, strong typing, inlining, and default argument features were added to C via Stroustrup's "C with Classes" to C compiler, Cpre.[10]


Пример работы 2:
Кликните здесь для просмотра всего текста

input.bin
Привет, мир!

output.bin
Ophber,~ lhp! 8

output1.bin
Ophber, lhp!
0
mymedia
193 / 193 / 48
Регистрация: 27.05.2011
Сообщений: 544
14.03.2014, 18:43 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
А что за функция to_string() ? Чёт я её не могу найти в справочнике С++? Как я понимаю, она переводит число в строку, т.е. to_string(14) == "14" . Так, да? А как она сообщает об ошибках?
Это я к чему. В программе раскодирования на 62 строке ты её зря вызываешь. Убери её вызов и замени на преобразование к типу string. Т.е. пусть 62 сточка будет такой:
C
1
kod[i].insert(0, string(z[i]);
Дело в том, что, очевидно, ф-ция to_string() примает число, а у тебя в z[i] уже символ. А при записи в файл твоя ф-ция decyatich() игнорирует символы не равные '1'. Т.о. если to_string('0') == "49" , то твоя ф-ция на это не реагирует.
А кодировка тут вот как задействована. Очевидно, ты файлы input.bin, output.bin и output1.bin сохраняешь в кодировке Windows-1251, а русские символы в ней имеют старший бит равный 1, а английские - 0, поэтому из кода всех русских символов вычитается 128.

Добавлено через 1 минуту
Может это поможет?

Добавлено через 2 минуты
P.S.: а в предыдущем посте я просто заутался где 7 строк, а где 8
0
delexa
2 / 2 / 1
Регистрация: 02.03.2011
Сообщений: 134
15.03.2014, 01:59  [ТС] #5
mymedia, Да, как раз в to_string() была проблема. Заменил в программе "рашифрование"

C++
1
2
3
4
5
for (int e=0; e<7; e++)     
        {
            char z1=z[e];
            kod[e].insert(0, to_string (z1));
        }
на
C++
1
2
3
4
5
6
for (int e=0; e<7; e++)     
        {
            string z1="";
            z1.push_back(z[e]);
            kod[e].insert(0,z1);
        }
И все заработало. Спасибо
0
15.03.2014, 01:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2014, 01:59
Привет! Вот еще темы с ответами:

функция изменяет старший байт числа на заданное значение не изменяя младший байт - C++
функция изменяет старший байт числа на заданное значение не изменяя младший байт. как можно проще

Посчитать в файле количество нулевых байт и различных байт - C++
Посчитать в файле кол-во нулевых байт и различных байт Кто решит буду весьма благодарен!:drink:

Переместить файловый указатель на позицию 220 байт от конца файла - C++
Файлы: нужен фрагмент кода! Обязательно использовать функции стандартной библиотеки ввода/вывода. Как переместить файловый...

Запись в первый байт массива число - C++
Допустим у нас есть такой массив char str; И нужно в первый байт записать сколько элементов в нем находится. Как это сделать? Хотя б с чего...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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