Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/103: Рейтинг темы: голосов - 103, средняя оценка - 4.62
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350

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

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

Студворк — интернет-сервис помощи студентам
Нужно перевести строку(string) в 16-й формат, как сделать? Знаю про std:hex, но он работает только с char и записать получаемое число в другую переменную нельзя.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.11.2015, 20:33
Ответы с готовыми решениями:

Как строку в самом коде VBA перевести в формат UTF-8
Доброе время суток. Встал такой вопрос, под access(2010) пишу код на VBA. задача такая, создать файл формата XML и запихнуть...

Как перевести строку формата string, состоящую из цифр, в формат float?
Добрый день! Подскажите, пожалуйста, как перевести строку формата string состоящую из цифр в формат float?

Первую строку считать из файла и перевести в формат Integer, а все остальные - в массивы
Народ, спасайте! Допустим, первая строка файла - натуральное число N, а последующие N строк содержат по несколько натуральных чисел,...

47
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350
25.11.2015, 17:42  [ТС]
Студворк — интернет-сервис помощи студентам
Все работает, спасибо. А можно вопрос. Сколько Вы лет изучали язык, чтобы сходу все это сделать ?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
25.11.2015, 21:04
Не знаю даже. Я его не изучал так, как в школе или в ВУЗе что-то изучают. Конкретно про rdbuf() была тема здесь на форуме; о том, что string может содержать что угодно, говорится в документации.
0
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350
26.11.2015, 18:16  [ТС]
Вроде все сделал как надо, но условие наличия вируса срабатывает при любых условиях, даже если сигнатуры нет в exe. В чем причина ошибки ?
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
#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;
    ostringstream oss;
    ifstream base("C:\\Base.bas");
    ifstream readFile(pathToFile, ifstream::binary);
    bool flag = false;
    char choise;
 
    oss << readFile.rdbuf();
 
    string data = oss.str(); // содержимое файла записываем в data
 
    readFile.close(); //закрываем файл
 
    int p;
    while (!base.eof())
    {
        getline(base, bytes);
        if ((p = data.find(bytes)) != string::npos)//ищем нужную последовательность в последовательности файла
        {
            flag = true;
            break;
        }
    }
    if (base.eof() && flag == true)//Если файл закончился и флаг принял значение 1, то вирус есть
    {
        cout << "est virus!" << endl;//Вывод сообщения об опасности
        cout << "Enter what you want to do(d - delete, s - skip): ";//Приглашение на ввод буквы соответствующему ей выбору
        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;
            }
            default:
                cout << "Enter 'd' or 's'" << endl;
                break;
            }
        }
    }
    
}
 
#endif
В файле - \x4d\x5a (Данной последовательности нет в exe).
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
26.11.2015, 19:40
Если сигнатуры записаны текстом, то при чтении нужно конвертировать. \x4d\x5a - это формат для программы C++, а в файле должно быть 4d5a. Примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
    while (getline(base, bytes))
    {
        string b;
        for (int i = 0; i < bytes.size(); i += 2)
            b += static_cast<char>(stoi(bytes.substr(i, 2), nullptr, 16));
        if ((p = data.find(b)) != string::npos)//ищем нужную последовательность в последовательности файла
        {
            flag = true;
            break;
        }
    }
1
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350
26.11.2015, 20:03  [ТС]
В stoi(bytes.substr(i,2) указана длина - 2 . Можно ли применять string::npos вместо данного параметра?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
26.11.2015, 20:10
Нет. У тебя же байт в шестнадцатеричном текстовом виде - это 2 символа. Поэтому 2.

Добавлено через 1 минуту
Думаю, что настоящие антивирусы не хранят сигнатуры текстом, они там бинарные сразу, поэтому конвертация не требуется.
0
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350
26.11.2015, 20:14  [ТС]
Все антивирусные базы закрыты, только сами разработчики знают, какого они вида. В 16 виде их легче хранить(меньше памяти исходный файл будет занимать) и проверка в разы быстрее из-за размера исходной строки.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
26.11.2015, 20:16
В бинарном меньше будет, а у тебя в текстовом - один реальный байт - это 2 байта символов текста.

Добавлено через 54 секунды

Не по теме:

Nik-, ты решил Касперского разорить или что? :)

1
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350
26.11.2015, 20:18  [ТС]
Получается, что записав в базу, допустим, 01001, то это сработает ? Если это вирусная сигнатура, и она присутствует в файле произойдет детектирование ?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
26.11.2015, 20:24
Ну я же показал, как надо. Пишешь сигнатуру в шестандцатеричном виде. Каждую в своей строке. С лидирующими нулями при необходимости, т. е. не F, а 0F и т. п.
1
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350
28.11.2015, 21:44  [ТС]
Мне дали задание "лечить" зараженные файлы путем удаления сигнатуры вируса из файла. С 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
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
28.11.2015, 22:15
В двоичном режиме открывай review.
Так что происходит-то? Не удаляется, не записывается?
0
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350
28.11.2015, 22:47  [ТС]
Я сам не могу понять, скорее всего не удаляется, т.к после удаление содержания ехе его иконка изменяется на обычную иконку исполняемого файла, но такого не происходит.
0
842 / 351 / 68
Регистрация: 20.11.2012
Сообщений: 843
29.11.2015, 07:02
Цитата Сообщение от Nik- Посмотреть сообщение
Мне дали задание "лечить" зараженные файлы путем удаления сигнатуры вируса из файла.
Задание университетское, судя по всему?
Для низкоуровневой работы с потоком байт C++ лишнее, имхо. Лучше тут простые Сишные возможности использовать, вместо того, чтобы городить этот высокоуровневый код). Удобно через mapped файлы работать. Для поиска подстроки в строке есть много хороших быстрых алгоритмов.
Так что если не сказано в задании работать именно с высокоуровневыми абстракциями C++, то стоит обратить внимание на подмножество Си в С++.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
29.11.2015, 08:53
Да пусть хоть это отладит.
0
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350
29.11.2015, 10:15  [ТС]
Алгоритмы поиска подстроки знаю, но удобнее, все же, использовать find(), имхо. С отображением файлов в память не работал, возможно, если все ошибки устраню, то воспользуюсь mapping' ом. Но вопрос остается вопросом. Почему не удаляется содержимое exe. (Мучаю exe, установленные на компьютер).
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
29.11.2015, 10:57
Программу покажи.
0
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350
29.11.2015, 11:05  [ТС]
Весь заголовочный файл сканирования. Скорее всего не работает удаление. 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
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
29.11.2015, 19:02
C++
1
std::ofstream review(pathToFile, std::ofstream::binary | std::ofstream::trunc);
В остальном работает. Фрагмент удаляется. Файл становится короче.
Что конкретно не устраивает?
1
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350
29.11.2015, 20:10  [ТС]
Это скорее всего происходило из-за расположения. После перемещения файла на диск D все пошло как надо. Спасибо. Как было сказано выше, можно использовать проецирование файла в память, стоит ли это делать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.11.2015, 20:10

Перевести формат документа
Помогите. пожалуйста. нужно перевести документы в формат xmcd

Перевести цену в формат текста
Добрый день. такой вопрос возник как перенести 19 270 руб. в такой формат автоматически Девятнадцать тысяч двести...

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

Перевести текст в формат UCS
Здравствуйте, собственно как перевести текст в формат UCS, правда не знаю толком что это такое, кодировка? Есть исходные данные с нета...

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
сукцессия 9. Математика подлости: как растения предали грибных друзей
anaschu 27.06.2026
Статья 2. Глобальная фосфорная война: эволюционно-экономические механизмы распределения биомов Земли Введение: Экологический рынок как игра с нулевой суммой Традиционная экология долгое время. . .
сукцессия 8. Как я спорил с ИИ, которые - агенты растений и ненавистники грибов!
anaschu 27.06.2026
Статья 1. Хроники грибного восстания: как Сократов диалог разрушил академические догмы ИИ Введение: Синдром «цифрового учебника» Современные большие языковые модели (LLM) обладают колоссальным. . .
Главный вопрос моделирования сукцессии
anaschu 27.06.2026
главный вопрос. Если эктомикориза лучше добывает недоступный фосфор. И ее масса максимальна из всех. А широколиственный лес тоже имеет самую крутую биомассу. То почему не возникло их симбиоза? Это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru