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

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

Войти
Регистрация
Восстановить пароль
 
 
Nik-
20 / 20 / 9
Регистрация: 12.07.2015
Сообщений: 339
#1

Перевести строку в 16-й формат - C++

22.11.2015, 20:33. Просмотров 1191. Ответов 47
Метки нет (Все метки)

Нужно перевести строку(string) в 16-й формат, как сделать? Знаю про std:hex, но он работает только с char и записать получаемое число в другую переменную нельзя.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2015, 20:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перевести строку в 16-й формат (C++):

Полученные секунды перевести в формат 00:00:00 - C++
11.Напишите программу, которая получает от пользователя два значения времени в формате 12:59:59, сохраняет их в переменных типа struct...

Перевести формат double в CString - C++
Всем привет! Я сейчас делаю программу в mfc, в которой при нажатии определенной кнопки в поле (которое имеет формат double) должно...

Перевести текущую дату в определенный формат - C++
помогите написать алгоритм: надо забрать системную дату с компутера и перевести ее в hex таким образом: DD 07 01 00 03 00 08 где...

Перевести длинную бинарную строку в строку с десятичными цифрами - C++
Добрый день. Проблема следующая: есть бинарное число 11010111010111111110.......11100011010110110 - необходимо его представить в виде...

Как разреженную матрицу перевести в формат CRS? - C++
Привет кодеры! Моя задача заключается в том чтобы перемножить две разреженные матрицы. Но для того чтобы это сделать нужно эти матрицы...

Перевести 1 строку с С#на С++ - C++
Как написать данную строку на С++ Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main", "Start Page",...

47
Nik-
20 / 20 / 9
Регистрация: 12.07.2015
Сообщений: 339
28.11.2015, 21:44  [ТС] #31
Мне дали задание "лечить" зараженные файлы путем удаления сигнатуры вируса из файла. С exe, который я создаю через блокнот все выходит, но с другими уже нет. Есть другие варианты делать это, не такие, как мой? Сделал так
C++
1
2
3
4
5
ofstream review(pathToFile, ios_base::trunc);
                data.erase(p, signature.size());//Удаляем сигнатуру вируса из буффера, содержащего данные файла
                review << data;//Записываем измененные данные файл(файл безопасен)
                cout << "File is reviewed!" << endl;
                review.close();
Добавлено через 1 минуту
Определяется наличия вируса так.
C++
1
2
3
4
5
6
7
8
9
10
while (getline(base, bytes))//Пока идет запись текста из базы в переменную
    {
        for (int i = 0; i < bytes.size(); i += 2)
            signature += static_cast<char>(stoi(bytes.substr(i, 2), nullptr, 16));//Записываем в переменную сигнатуру
        if ((p = data.find(signature)) != string::npos)//ищем нужную последовательность в последовательности файла
        {
            flag = true;//Флаг - 1. Вирус обнаружен
            break;//Останавливаем цикл
        }
    }
0
nmcf
5704 / 5015 / 1713
Регистрация: 14.04.2014
Сообщений: 20,473
28.11.2015, 22:15 #32
В двоичном режиме открывай review.
Так что происходит-то? Не удаляется, не записывается?
0
Nik-
20 / 20 / 9
Регистрация: 12.07.2015
Сообщений: 339
28.11.2015, 22:47  [ТС] #33
Я сам не могу понять, скорее всего не удаляется, т.к после удаление содержания ехе его иконка изменяется на обычную иконку исполняемого файла, но такого не происходит.
0
WhiteP
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
29.11.2015, 07:02 #34
Цитата Сообщение от Nik- Посмотреть сообщение
Мне дали задание "лечить" зараженные файлы путем удаления сигнатуры вируса из файла.
Задание университетское, судя по всему?
Для низкоуровневой работы с потоком байт C++ лишнее, имхо. Лучше тут простые Сишные возможности использовать, вместо того, чтобы городить этот высокоуровневый код). Удобно через mapped файлы работать. Для поиска подстроки в строке есть много хороших быстрых алгоритмов.
Так что если не сказано в задании работать именно с высокоуровневыми абстракциями C++, то стоит обратить внимание на подмножество Си в С++.
0
nmcf
5704 / 5015 / 1713
Регистрация: 14.04.2014
Сообщений: 20,473
29.11.2015, 08:53 #35
Да пусть хоть это отладит.
0
Nik-
20 / 20 / 9
Регистрация: 12.07.2015
Сообщений: 339
29.11.2015, 10:15  [ТС] #36
Алгоритмы поиска подстроки знаю, но удобнее, все же, использовать find(), имхо. С отображением файлов в память не работал, возможно, если все ошибки устраню, то воспользуюсь mapping' ом. Но вопрос остается вопросом. Почему не удаляется содержимое exe. (Мучаю exe, установленные на компьютер).
0
nmcf
5704 / 5015 / 1713
Регистрация: 14.04.2014
Сообщений: 20,473
29.11.2015, 10:57 #37
Программу покажи.
0
Nik-
20 / 20 / 9
Регистрация: 12.07.2015
Сообщений: 339
29.11.2015, 11:05  [ТС] #38
Весь заголовочный файл сканирования. Скорее всего не работает удаление. 71 строка.
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
#pragma once
 
#ifndef SCAN_H_INCLUDED
#define SCAN_H_INCLUDED
 
#include <fstream>
#include <iostream>
#include <string>
#include <sstream>
 
using namespace std;
 
void scan(char* pathToFile)
{
    string bytes;//Перемнная для содержания сигнатуры
    string signature;//Перемнная для содержания сигнатуры после конвертации в 16 вид
    ostringstream oss;//Поток для записи из файла в переменну.
    ifstream base("C:\\Base.bas");//Поток чтения из файла
    if (!base.is_open())//Проверка на открытие файла
        cerr << "Base can't be opened!" << endl;
    ifstream suspectFile(pathToFile, ifstream::binary);//Потое открытия проверяемого файла
    if (!suspectFile.is_open())//Проверка на открытие файла
        cerr << "Can't open file!" << endl;
 
    bool flag = false;//Флаг, определяющий наличие вируса. 1 - есть, 0 - нет.
    char choise;//Выбор
 
    oss << suspectFile.rdbuf();//Записываем в поточную переемнную текст из файла, открытого в двоичном режиме
    string data = oss.str(); // содержимое файла записываем в data
 
    suspectFile.close(); //закрываем файл
 
    int p;
    
    while (getline(base, bytes))//Пока идет запись текста из базы в переменную
    {
        for (int i = 0; i < bytes.size(); i += 2)
            signature += static_cast<char>(stoi(bytes.substr(i, 2), nullptr, 16));//Записываем в переменную сигнатуру
        if ((p = data.find(signature)) != string::npos)//ищем нужную последовательность в последовательности файла
        {
            flag = true;//Флаг - 1. Вирус обнаружен
            break;//Останавливаем цикл
        }
    }
    
    if (flag == true)//Если файл закончился и флаг не принял значение 1, то вирус есть
    {
        cout << "Est virus!" << endl;//Вывод сообщения об опасности
        cout << "Enter what you want to do(d - delete, s - skip, r - review): ";//Приглашение на ввод буквы соответствующему ей выбору
        cin >> choise;//Ввод одной буквы
 
        for (int i = 0; i < 1; i++)//Предпологает только один ввод
        {
            switch (choise)
            {
            case 'd'://Удаление файла
            {
                if (remove(pathToFile) != 0)//Если файл не удалился
                    cerr << "File isn't deleted!" << endl;//Сообщение об ошибке, что файл не удален
                else cout << "File is deleted!" << endl;//Если удален, то вывести, что файл удален
                break;
            }
 
            case 's'://Пропуск файла
            {
                cout << "File is skiped!" << endl;
                continue;//Продолжить работу
                break;
            }
 
            case 'r'://лечить
            {
                ofstream review(pathToFile, ios::binary ,ios_base::trunc);
                data.erase(p, signature.size());//Удаляем сигнатуру вируса из буффера, содержащего данные файла
                review << data;//Записываем измененные данные файл(файл безопасен)
                cout << "File is reviewed!" << endl;
                review.close();
            }
            default:
                cout << "Enter 'd', 's' or 'r'" << endl;
                break;
            }
        }
    }
    else cout << "Virusov net!" << endl;
    base.close();
}
 
#endif
0
nmcf
5704 / 5015 / 1713
Регистрация: 14.04.2014
Сообщений: 20,473
29.11.2015, 19:02 #39
C++
1
std::ofstream review(pathToFile, std::ofstream::binary | std::ofstream::trunc);
В остальном работает. Фрагмент удаляется. Файл становится короче.
Что конкретно не устраивает?
1
Nik-
20 / 20 / 9
Регистрация: 12.07.2015
Сообщений: 339
29.11.2015, 20:10  [ТС] #40
Это скорее всего происходило из-за расположения. После перемещения файла на диск D все пошло как надо. Спасибо. Как было сказано выше, можно использовать проецирование файла в память, стоит ли это делать?
0
nmcf
5704 / 5015 / 1713
Регистрация: 14.04.2014
Сообщений: 20,473
29.11.2015, 20:43 #41
Ну если хочется всю программу переделывать.
1
Nik-
20 / 20 / 9
Регистрация: 12.07.2015
Сообщений: 339
29.11.2015, 20:46  [ТС] #42
Тогда не стану. Просто я не знаю про маппинг, никогда не использовал.
0
nmcf
5704 / 5015 / 1713
Регистрация: 14.04.2014
Сообщений: 20,473
29.11.2015, 20:46 #43
Маппинг в WinAPI, насколько я знаю.
0
Nik-
20 / 20 / 9
Регистрация: 12.07.2015
Сообщений: 339
29.11.2015, 20:48  [ТС] #44
Да,ошибка, проецирование в память. Так точнее.
0
Nik-
20 / 20 / 9
Регистрация: 12.07.2015
Сообщений: 339
06.12.2015, 23:01  [ТС] #45
А можно сделать это без функции stoi ?
C++
1
2
3
4
5
6
7
8
9
10
while (getline(base, bytes))//Пока идет запись текста из базы в переменную
    {
        for (int i = 0; i < bytes.size(); i += 2)
            signature += static_cast<char>(stoi(bytes.substr(i, 2), nullptr, 16));//Записываем в переменную сигнатуру
        if ((p = data.find(signature)) != string::npos)//ищем нужную последовательность в последовательности файла
        {
            flag = true;//Флаг - 1. Вирус обнаружен
            break;//Останавливаем цикл
        }
    }
0
06.12.2015, 23:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2015, 23:01
Привет! Вот еще темы с ответами:

Перевести строку типа string, в строку типа double - C++
Помогите с кодом. Как строку типа стринг, например 123123.123123, перевести в тип double? Кода перевожу с помощью &quot;atof&quot; оно берёт только...

Перевести строку в переменную - C++
Есть массив строковый, содержащий в строковом виде команду и переменные(например |сложение| Ax| Bx|), но переменные в строковом виде, и...

Как перевести массив в строку? - C++
я хочу чтобы можно было вводить какую нибудь строку,чтобы она переводилась в заглавные или прописные буквы...о как это сделать , я не знаю...

Не получается перевести 2 массива в строку - C++
Здравствуйте всем. Вобщем, курсовая, заданее следущее: написать класс для чисел единый, чтобы можно было складывать разные типы, int...


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

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

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