Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
2 / 2 / 0
Регистрация: 05.02.2016
Сообщений: 66
1

Преобразование string в unsigned char

15.09.2021, 13:14. Показов 4812. Ответов 13
Метки c++ (Все метки)

Author24 — интернет-сервис помощи студентам
Моя программа из текстового документа заносит данные в переменную line. Дальше моя задача эти данные расшифровать, но проблема в том, что переменная line имеет тип string, а мне для дешифрования нужен unsigned char.
В текстовом документе находится зашифрованная строка "h d 9 0 3 4f 4d 14 59 49 d 44 5a 1f 17 1d 4f 5a 1f 17 1d 4f 5a 1f 17 1d 4f 4f 1 b 45 41 f a 44 4d 14 59 4e 1b 18 f 7 17 52 49 1a 53 46 f 1f 13 45 48 1d 1b a 16 17 1".

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
#include <iostream>
#include <windows.h>
#include <fstream>
#include <string>
 
 
using namespace std;
 
int main(int argc, char* argv[])
{
 
    int s = 3;
    string d;
 
    while (s)
    {
        if (GetAsyncKeyState(9))
        {
            s--;
            cout << s;
        }
        Sleep(100);
    }
    
    string line;
    
    ifstream in("example.txt"); // окрываем файл для чтения
    if (in.is_open())
    {
        while (getline(in, line))
        {
            cout << line << endl;
        }
    }
    in.close();     // закрываем файл
 
     
    ofstream out;          // поток для записи
    out.open("id.txt"); // окрываем файл для записи
    if (out.is_open())
    {
        out << line << endl;
    }
 
    cout << "End of program" << endl;
 
   
    
 
 
    unsigned short a;
    unsigned char line;
    
    cin >> line;
    cout << line;
    while (cin >> hex >> a)
    {
        line= a ^ line;
        cout << line;
    }
 
return 0;
             
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.09.2021, 13:14
Ответы с готовыми решениями:

Преобразование unsigned short в unsigned char
Как можно преобразовать unsigned short в unsigned char ?

Сделать преобразование unsigned char в char, а затем типу int
Здраствуйте, есть вопрос: Число представлено двумя полями: типа long для рублей и unsigned char -...

Unsigned char to string
Привет всем. У меня полная непонятица unsigned char c = '1'; std::string ass((char*)c); ...

Конвертация string to unsigned char
День всем добрый! Каким образом можно произвести перевод значения переменной типа &quot;string&quot; в...

Преобразовать const unsigned char* в std::string (или _bstr_t )
Здравствуйте старшие товарищи! Есть функция, которая возвращает результат типа const unsigned...

13
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,719
15.09.2021, 15:53 2
Лучший ответ Сообщение было отмечено Tillka как решение

Решение

C++
1
2
3
4
5
    system("chcp 1251>NUL");
    string line="Привет!"; // русский текст для проверки, что с отрицательными кодами тоже работает
    unsigned char TextLine[100];
    strcpy_s((char*)TextLine,100,line.c_str());
    cout<<TextLine;
0
2 / 2 / 0
Регистрация: 05.02.2016
Сообщений: 66
16.09.2021, 06:15  [ТС] 3
zss, подскажи пожалуйста, куда именно вставить в мой код и какие переменные поменять, чтобы работало шифрование? А то у меня ошибки выходят.
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,719
16.09.2021, 08:05 4
А разве это не очевидно.
У Вас
Цитата Сообщение от Tillka Посмотреть сообщение
C++
1
2
3
4
while (getline(in, line))
 {
     cout << line << endl;
 }
C++
1
2
3
4
5
6
7
8
while (getline(in, line))
 {
     #cout << line << endl;
     unsigned char TextLine[100];
     strcpy_s((char*)TextLine,100,line.c_str());
     cout<<TextLine;
//  а тут шифруйте на здоровье
 }
0
2 / 2 / 0
Регистрация: 05.02.2016
Сообщений: 66
16.09.2021, 08:12  [ТС] 5
zss, когда запускаю проект, дохожу до этого участка кода, выходит следующая ошибка (во вложении), ниже мой конечный код.

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
#include <iostream>
#include <windows.h>
#include <fstream>
#include <string>
 
 
using namespace std;
 
int main(int argc, char* argv[])
{
 
    int s = 3;
    string d;
 
    while (s)
    {
        if (GetAsyncKeyState(9))
        {
            s--;
            cout << s;
        }
        Sleep(100);
    }
    
    string line;
    
    ifstream in("example.txt"); // окрываем файл для чтения
    if (in.is_open())
    {
        while (getline(in, line))
        {
            //cout << line << endl;
            unsigned char TextLine[100];
            strcpy_s((char*)TextLine, 100, line.c_str());
            cout << TextLine;
        }
    }
    in.close();     // закрываем файл
 
     
    ofstream out;          // поток для записи
    out.open("id.txt"); // окрываем файл для записи
    if (out.is_open())
    {
        out << line << endl;
    }
 
    cout << "End of program" << endl;
 
   
    
 
 
    unsigned short a;
    unsigned char TextLine;
    
    cin >> TextLine;
    cout << TextLine;
    while (cin >> hex >> a)
    {
        TextLine = a ^ TextLine;
        cout << TextLine;
    }
 
return 0;
             
}
Миниатюры
Преобразование string в unsigned char  
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,719
16.09.2021, 08:27 6
Лучший ответ Сообщение было отмечено Tillka как решение

Решение

Разве не очевидно, что читаемые строки длиннее 100 символов.
Напишите
C++
1
2
unsigned char TextLine[1000];
strcpy_s((char*)TextLine, 1000, line.c_str());
p.s. и удалите весь код ниже 39 строки.
Весь код для шифрования нужно вставить между 35 и 36 строками.
0
2 / 2 / 0
Регистрация: 05.02.2016
Сообщений: 66
16.09.2021, 11:27  [ТС] 7
zss, извиняюсь за наглость, но всё равно не работает. Ругается на 44 строку, на переменные TextLine.

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 <iostream>
#include <windows.h>
#include <fstream>
#include <string>
 
 
using namespace std;
 
int main(int argc, char* argv[])
{
 
    int s = 3;
    string d;
 
    while (s)
    {
        if (GetAsyncKeyState(9))
        {
            s--;
            cout << s;
        }
        Sleep(100);
    }
 
    string line;
 
    ifstream in("example.txt"); // окрываем файл для чтения
    if (in.is_open())
    {
        while (getline(in, line))
        {
            //cout << line << endl;
            unsigned char TextLine[1000];
            strcpy_s((char*)TextLine, 1000, line.c_str());
            cout << TextLine;
 
            unsigned short a;
            unsigned char TextLine;
 
            cin >> TextLine;
            cout << TextLine;
            while (cin >> hex >> a)
            {
                TextLine = a ^ TextLine;
                cout << TextLine;
            }
 
        }
    }
    in.close();     // закрываем файл
 
 
   /* ofstream out;          // поток для записи
    out.open("id.txt"); // окрываем файл для записи
    if (out.is_open())
    {
        out << line << endl;
    }
 
    cout << "End of program" << endl;
 
 
 
 
 
    unsigned short a;
    unsigned char TextLine;
 
    cin >> TextLine;
    cout << TextLine;
    while (cin >> hex >> a)
    {
        TextLine = a ^ TextLine;
        cout << TextLine;
    }
    */
    return 0;
 
}
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,719
16.09.2021, 11:51 8
1.TextLine - это АДРЕС массива символов, который Вы собираетесь обработать.
Массив заканчивается числом ноль.
Зачем Вы повторно объявили TextLine в 38 строке
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
            unsigned char a;
            unsigned char Uncode[1000]={0};
 
            #cin >> TextLine;
            #cout << TextLine;
            while (cin >> hex >> a) // конец ввода ctrl^z в новой строке
            {
                int L;
                for(L=0;TextLine[L]!=0;L++)
                     Uncode[L] = a ^ TextLine[L];
                #cout << Uncode; Нельзя использовать, т.к. внутри закодированного текста может оказаться ноль
                for(int i=0;i<L;i++) // L - количество введенных символов
                     cout<<Uncode[i];
            }
0
2 / 2 / 0
Регистрация: 05.02.2016
Сообщений: 66
22.09.2021, 13:38  [ТС] 9
zss, извините за долгое отсутствие. Не могу понять в чём проблема, результат выполнения программы во вложении. Что не так?
Код:
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
#include <iostream>
#include <windows.h>
#include <fstream>
#include <string>
 
 
using namespace std;
 
int main(int argc, char* argv[])
{
 
    int s = 3;
    string d;
 
    while (s)
    {
        if (GetAsyncKeyState(9))
        {
            s--;
            cout << s;
        }
        Sleep(100);
    }
 
    string line;
 
    ifstream in("example.txt"); // окрываем файл для чтения
    if (in.is_open())
    {
        while (getline(in, line))
        {
            //cout << line << endl;
            unsigned char TextLine[300];
            strcpy_s((char*)TextLine, 300, line.c_str());
            cout << TextLine;
 
            unsigned char a;
            unsigned char Uncode[300] = { 0 };
 
            //cin >> TextLine;
            //cout << TextLine;
            while (cin >> hex >> a) // конец ввода ctrl^z в новой строке
            {
                int L;
                for (L = 0; TextLine[L] != 0; L++)
                    Uncode[L] = a ^ TextLine[L];
                //cout << Uncode; Нельзя использовать, т.к.внутри закодированного текста может оказаться ноль
                    for (int i = 0; i < L; i++) // L - количество введенных символов
                        cout << Uncode[i];
            }
 
        }
    }
    in.close();     // закрываем файл
 
 
   /* ofstream out;          // поток для записи
    out.open("id.txt"); // окрываем файл для записи
    if (out.is_open())
    {
        out << line << endl;
    }
 
    cout << "End of program" << endl;
 
 
 
 
 
    unsigned short a;
    unsigned char TextLine;
 
    cin >> TextLine;
    cout << TextLine;
    while (cin >> hex >> a)
    {
        TextLine = a ^ TextLine;
        cout << TextLine;
    }
    */
    return 0;
 
}
Миниатюры
Преобразование string в unsigned char  
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,719
22.09.2021, 15:40 10
Цитата Сообщение от Tillka Посмотреть сообщение
C++
1
2
3
4
5
6
while (getline(in, line))
 {
 //cout << line << endl;
     unsigned char TextLine[300];
     strcpy_s((char*)TextLine, 300, line.c_str());
     ...
Зачем такое извращение?
C++
1
2
3
4
        unsigned char TextLine[300];
        while (in.getline(TextLine, 300))
        {
              ....
Цитата Сообщение от Tillka Посмотреть сообщение
for (int i = 0; i < L; i++) // L - количество введенных символов
cout << Uncode[i];
А что Вы надеялись тут увидеть? Декодированные символы могут оказаться в любой части кодовой таблицы.
Можете посмотреть получившиеся коды
C++
1
    cout << (unsigned int)Uncode[i]<<' ';
0
2 / 2 / 0
Регистрация: 05.02.2016
Сообщений: 66
23.09.2021, 08:41  [ТС] 11
zss, добрый день. Я благодарен вам за помощь, но что-то никак не хочет работать. Ошибка во вложении. Не могу понять как мне увидеть декодированный текст.

Мой код:
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
#include <iostream>
#include <windows.h>
#include <fstream>
#include <string>
 
 
using namespace std;
 
int main(int argc, char* argv[])
{
 
    int s = 3;
    string d;
 
    while (s)
    {
        if (GetAsyncKeyState(9))
        {
            s--;
            cout << s;
        }
        Sleep(100);
    }
 
    string line;
 
    ifstream in("example.txt"); // окрываем файл для чтения
    if (in.is_open())
    {
        while (getline(in, line))
        {
            //cout << line << endl;
            unsigned char TextLine[164];
            strcpy_s((char*)TextLine, 164, line.c_str());
            cout << TextLine;
 
            unsigned char a;
            unsigned char Uncode[164] = { 0 };
 
            
            while (cin >> hex >> a) // конец ввода ctrl^z в новой строке
            {
                int L;
                for (L = 0; TextLine[L] != 0; L++)
                    Uncode[L] = a ^ TextLine[L];
                //cout << Uncode; Нельзя использовать, т.к.внутри закодированного текста может оказаться ноль
                for (int i = 0; i < L; i++) // L - количество введенных символов
                    cout << Uncode[i];
                    cout << (unsigned int)Uncode[i] << ' ';
 
            }
 
        }
    }
    in.close();     // закрываем файл
 
 
  
    return 0;
 
}
Миниатюры
Преобразование string в unsigned char  
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,719
23.09.2021, 08:55 12
Цитата Сообщение от Tillka Посмотреть сообщение
C++
1
2
3
for (int i = 0; i < L; i++) // L - количество введенных символов
      cout << Uncode[i];
      cout << (unsigned int)Uncode[i] << ' ';
Поскольку Вы не поставили фигурные скобки, то 3-я строка не принадлежит циклу for(int i....
Соответственно, переменная i локализованная в цикле для нее не видна.

p.s. А с какой целью Вы оставили вторую строку?
Символьное представление закодированного текста совершенно бессмысленно.
0
2 / 2 / 0
Регистрация: 05.02.2016
Сообщений: 66
23.09.2021, 09:08  [ТС] 13
zss, "p.s. А с какой целью Вы оставили вторую строку?" - хотел посмотреть. Сейчас декодируется, но в числа, а я хотел в текст, чтобы в дальнейшем с ним работать. Код шифрования брал с другого сайта. Пример во вложении.

PS. Т.е. я хотел брать текст из файла, его расшифровывать и потом с ним работать.
Миниатюры
Преобразование string в unsigned char  
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,719
23.09.2021, 09:19 14
Чтобы получать только буквы, нужно ограничить интервал результатов.
А, поскольку кодирование делается через исключающее или, то я не представляю, как это можно сделать.
И, кстати, в приведенном примере выводятся не символы, а шестнадцатеричные значения.
Ну так и Вы выводите тоже значения используя модификатор hex
C++
1
cout << hex<<(unsigned int)Uncode[i] << ' ';
.
0
23.09.2021, 09:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.09.2021, 09:19
Помогаю со студенческими работами здесь

Преобразование String в Char или Char неограниченной длинны
В общем, мне нужно было вводимый текст разбивать по строкам по разделителю, который пользователь...

Преобразовать строку String в массив #define byte_t unsigned char и обратно
Собственно танцы с бубном долгое время. Подскажите пожалуйста, как правильно и оптимально это...

Приведение типов unsigned char[2] to unsigned char [64]
Добрый день! Подскажите пожалуйста, как поступить. Есть простая функция main int main() { ...

Преобразование string в char*
char* string_to_char(string str){ int size = str.size(); char *ch = new char; for(int i = 0;...

Преобразование char* в string
Доброго времени суток. Если я динамически выделил память для массива типа char, то как его можно...

Преобразование string в char*
int fun(char*); int main() { int a; string strok; strok=&quot;abc&quot;; strok+=&quot;cde&quot;; ...


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

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