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

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

Восстановить пароль Регистрация
 
delexa
2 / 2 / 1
Регистрация: 02.03.2011
Сообщений: 134
14.03.2014, 03:32     Закодировать файл. Взять 7 байт. Первый бит каждого байта переместить в 8 байт #1
Нужно открыть бинарный файл и закодировать следующим образом. Взять 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;
}


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

Посчитать в файле количество нулевых байт и различных байт C++
Как прочитать несколько байтов в файле с n-го байта по m-й байт ? C++
C++ Удалить из каждого байта строки первый (старший) бит.
Порядок байт в слове и бит в байте C++
Для целого числа А выделить старший байт и поставить его на место младшего байта. старший байт при этом обнулить. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mymedia
190 / 190 / 48
Регистрация: 27.05.2011
Сообщений: 543
14.03.2014, 14:26     Закодировать файл. Взять 7 байт. Первый бит каждого байта переместить в 8 байт #2
Мне кажется, или у тебя при кодировании ты записываешь в файл только семь строк вместо восьми на 71-72 строках первой программы, а при раскодировании 57 строка? Или я ошибаюсь? Честно не проверял

Добавлено через 42 секунды
Может где ещё ошибки...
delexa
2 / 2 / 1
Регистрация: 02.03.2011
Сообщений: 134
14.03.2014, 15:43  [ТС]     Закодировать файл. Взять 7 байт. Первый бит каждого байта переместить в 8 байт #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!
mymedia
190 / 190 / 48
Регистрация: 27.05.2011
Сообщений: 543
14.03.2014, 18:43     Закодировать файл. Взять 7 байт. Первый бит каждого байта переместить в 8 байт #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
delexa
2 / 2 / 1
Регистрация: 02.03.2011
Сообщений: 134
15.03.2014, 01:59  [ТС]     Закодировать файл. Взять 7 байт. Первый бит каждого байта переместить в 8 байт #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);
        }
И все заработало. Спасибо
Yandex
Объявления
15.03.2014, 01:59     Закодировать файл. Взять 7 байт. Первый бит каждого байта переместить в 8 байт
Ответ Создать тему
Опции темы

Текущее время: 17:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru