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

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

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

Author24 — интернет-сервис помощи студентам
Нужно перевести строку(string) в 16-й формат, как сделать? Знаю про std:hex, но он работает только с char и записать получаемое число в другую переменную нельзя.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.11.2015, 20:33
Ответы с готовыми решениями:

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

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

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

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

47
6 / 6 / 3
Регистрация: 19.09.2010
Сообщений: 173
22.11.2015, 20:45 2
C++
1
2
std::string s = "5f0066";
int num = std::stoi(s, 0, 16);
Добавлено через 6 минут
Для вывода:
C++
1
std::cout << std::hex << num;
0
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350
22.11.2015, 20:49  [ТС] 3
А можно это реализовывать с файловым вводом/выводом?
Данный код не работает, останавливает работу и выдает ошибку Возникло необработанное исключение по адресу 0x7584C42D в ТЕСТ.exe: исключение Microsoft C++: std::invalid_argument по адресу памяти 0x0030F9F4.
Код:
C++
1
2
3
4
5
6
7
8
string input;
    string str;
    ifstream f("C:\\EXE.exe");
    while (!f.eof()) {
        getline(f, input);
        str += input;
    }
    stoi(str, 0, 16);
Добавлено через 57 секунд
Упс, не заметил второе сообщение. Сейчас

Добавлено через 52 секунды
Хотя выдает такую же ошибку, которую описал выше
0
6 / 6 / 3
Регистрация: 19.09.2010
Сообщений: 173
22.11.2015, 21:09 4
C++
1
2
3
4
5
6
7
8
9
10
std::ofstream fileOut("out.txt");
    std::ifstream fileIn("in.txt");
    std::string s = "5f0066";
    int num = std::stoi(s, 0, 16);
    fileOut << std::hex << num << std::endl;
    getline(fileIn, s);
    int numIn = stoi(s, 0, 16);
    std::cout << std::hex << numIn << std::endl;
    fileOut.close();
    fileIn.close();
0
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350
22.11.2015, 21:18  [ТС] 5
А без записи в другой файл? Создавать файл, чтобы в него записать одну строчку, причем этот файл используется как буфер - это, мне кажется, не практично.
Нашел в интернете, но там выдает немного не правильный результат(сравнивал две получившиеся строки). Как это можно использовать, чтобы сделать верную ф-цию перевода.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
string string_to_hex(const string& input)
{
    static const char* const lut = "0123456789ABCDEF";
    size_t len = input.length();
 
    string output;
    output.reserve(2 * len);
    for (size_t i = 0; i < len; ++i)
    {
        const unsigned char c = input[i];
        output.push_back(lut[c >> 4]);
        output.push_back(lut[c & 15]);
    }
    return output;
}
0
6 / 6 / 3
Регистрация: 19.09.2010
Сообщений: 173
22.11.2015, 21:24 6
Погодите, объясните понятнее задачу... Выше есть пример(продублирую тут) считывания числа в 16 формате в std::string, затем его перевод в int и вывод на консоль в 16 с/с. Какая задача-то..?

К примеру, в файле in.txt будет строка abc, которая считается в переменную s. Затем, в 4 строке, функция stoi переведет эту строку в int. В следующей строке вывод int в формате 16 с/с.

C++
1
2
3
4
5
6
    std::ifstream fileIn("in.txt");
    std::string s;
    getline(fileIn, s);
    int numIn = stoi(s, 0, 16);
    std::cout << std::hex << numIn << std::endl;
    fileIn.close();
0
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350
22.11.2015, 21:43  [ТС] 7
Задача - нужно из файла считать строку в переменную типа string, пусть эта строка будет abc. Следовательно s = abc. Дальше нужно создать еще переменную типа string ы2 и записать в нее 16 - ричное значение s,то есть abc. Переменная s2 будет иметь такой вид(к примеру, не знаю, как abc будет выглядить в 16-й с/c) - 45a50f. Ну а дальше вывести на экран.
0
6 / 6 / 3
Регистрация: 19.09.2010
Сообщений: 173
22.11.2015, 21:56 8
Строка в файле - это шестнадцатеричное число или нет?
16 с/с содержит: 0123456789abcdef
Т.е. строка abc в файле будет представлена в num как 0x00000abc
0
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350
22.11.2015, 22:03  [ТС] 9
Строка в файле - не число вообще. Это набор символов или букв. Например это - A string like "Hello World" to hex format: 48656C6C6F20576F726C64. Нашел на сайте. Слова типа Hello World будут в файле(ну или любые другие слова). Вообще, может я думаю не в правильном направлении. Мне надо вывести последовательность байт файла. Это из себя представляет 16-ричную строку, например - 48656C6C6F20576F726C64. Но обязательно все записывать в переменные типа string.
0
7789 / 6556 / 2984
Регистрация: 14.04.2014
Сообщений: 28,661
22.11.2015, 23:51 10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
string input;
    string str, str2;
    ifstream f("C:\\data.txt");
    while (!f.eof()) {
        getline(f, input);
        str += input;
    }
 
    ostringstream oss;
 
    for (int i = 0; i < str.length(); ++i)
        oss << setw(2) << setfill('0') << static_cast<unsigned>(static_cast<unsigned char>(str[i]));
 
    str2 = oss.str();
1
6 / 6 / 3
Регистрация: 19.09.2010
Сообщений: 173
23.11.2015, 08:54 11
Цитата Сообщение от nmcf Посмотреть сообщение
static_cast<unsigned>(static_cast<unsigned char>(str[i]))
При этом в выходной строке будут числа в 10 с/с, разве нет? ТС, как я понял, хочет, чтобы в выходной строке были числа в 16 с/с, т.е. ASCII коды символов в 16 с/с.
0
7789 / 6556 / 2984
Регистрация: 14.04.2014
Сообщений: 28,661
23.11.2015, 09:52 12
Цитата Сообщение от Minchanin-Bel Посмотреть сообщение
При этом в выходной строке будут числа в 10 с/с
C++
1
oss << setw(2) << setfill('0') << hex << static_cast<unsigned>(static_cast<unsigned char>(str[i]));
2
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350
23.11.2015, 18:53  [ТС] 13
То, что я прошу, по идее, должно вывести, как минимум, часть заголовка exe файла, так?. Вот, что из себя представляет этот заголовок:
00-01 4D5A — сигнатура файла .EXE;
02-03 Длина образа задачи по модулю 512 (то есть число полезных байт в последнем блоке). Компоновщики версий до 1.10 помещали в это поле 04; если оно имеет такое значение, его рекомендуется игнорировать);
04-05 Длина файла в блоках;
06-07 Число элементов таблицы настройки адресов;
08-09 Длина заголовка в 16-байтных параграфах. Используется для выяснения начала тела загрузочного модуля;
0A-0B Минимальный объем памяти, которую нужно выделить после конца образа задачи (в 16-байтных параграфах);
0C-0D Максимальный объем памяти, которую нужно выделить после конца образа задачи (в 16-байтных параграфах);
0E-0F Сегментный адрес начала стекового сегмента относительно начала образа задачи;
10-11 Значение SP при входе в задачу;
12-13 Контрольная сумма — ноль минус результат сложения без переноса всех слов файла;
14-15 Значение IP (счетчика команд) при входе в задачу;
16-17 Сегментный адрес начала кодового сегмента относительно начала образа задачи;
18-19 Адрес первого элемента таблицы настройки адресов относительно начала файла;
1A-1B Номер сегмента перекрытий (0 для корневого сегмента программы).

Добавлено через 4 минуты
Я плохо разбираюсь в exe. Я думаю, что заблуждаюсь в том, что надо выводить последовательность байт именно тем способ, что я прошу.
0
836 / 343 / 67
Регистрация: 20.11.2012
Сообщений: 795
23.11.2015, 19:41 14
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
#include <iostream>
#include "windows.h"
#include <fstream>
#include <iomanip>
 
int main(int argc, char ** argv)
{
    std::ifstream ifs("test.exe", std::ios::binary);
 
    PBYTE buf = new BYTE[512];
 
    ifs.read((char*)buf, 512);
    std::cout.fill('0');
    std::cout << "     ";
    for (int i = 0; i < 16; i++)
        std::cout << "  " << std::hex <<  std::setw(2)<< std::uppercase << i;
    std::cout << '\n' << std::endl;
 
 
    for (int i = 0; i < 512; i+=16)
    {
        std::cout << std::hex << std::setw(3) << std::uppercase << i << "  ";
        for (int c = 0; c < 16; c++)
        {
            std::cout << "  " << std::hex << std::setw(2) << std::uppercase <<(int) buf[i+c];
        }
        std::cout << std::endl;
    }
    system("pause");
    ifs.close();
 
 
}
2
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350
23.11.2015, 19:56  [ТС] 15
Вооот, то что надо, спасибо огромное А не могли бы Вы пояснить все строчки кода, пожалуйста. Буду благодарен.

Добавлено через 10 минут
Совсем забыл. Еще нужно использовать переменные типа string, куда это добавить?

Добавлено через 1 минуту
Все усложняется из-за алгоритма поиска подстроки, который поддерживает только string
0
836 / 343 / 67
Регистрация: 20.11.2012
Сообщений: 795
23.11.2015, 20:04 16
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
#include <iostream>
#include "windows.h"
#include <fstream>
#include <iomanip>
 
int main(int argc, char ** argv)
{
    //открываем бинарный файл
    std::ifstream ifs("test.exe", std::ios::binary);
 
    //формируем буфер из 512 байт
    PBYTE buf = new BYTE[512];
 
    //читаем 512 байт в буфер
    ifs.read((char*)buf, 512);
 
    //заливка нулями (чтобы было 01, а не 1)
    std::cout.fill('0');
 
    //отступ для выравнивания таблицы
    std::cout << "     ";
 
    //шапка с номерами байт
    for (int i = 0; i < 16; i++)
        //вывод в 16м формате, прописными символами, шириной мин 2 символа (остальное заливается 0 (см. выше)
        std::cout << "  " << std::hex <<  std::setw(2)<< std::uppercase << i;
 
    //отступ
    std::cout << '\n' << std::endl;
 
    //выводим по 16 байт на строку
    for (int i = 0; i < 512; i+=16)
    {
        //номер строки
        std::cout << std::hex << std::setw(3) << std::uppercase << i << "  ";
        for (int c = 0; c < 16; c++)
        {
            //вывод потока байт в 16м формате, прописными символами, шириной мин 2 символа (остальное заливается 0 (см. выше)
            std::cout << "  " << std::hex << std::setw(2) << std::uppercase <<(int) buf[i+c];
        }
        std::cout << std::endl;
    }
    delete[] buf;
    system("pause");
    ifs.close();
}
А зачем string? Я C++ не помню уже, все больше неприплюснутый си и winapi, так что вот так сразу как в строку, а не в поток выводить - не скажу.
А вообще работа с потоком байт через string - это костыль тот еще, имхо.
1
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350
24.11.2015, 16:35  [ТС] 17
Да вот, string обязателен, буду думать. Кстати, а это можно сделать через двумерный массив, ведь. Тоже самое, только у каждой ячейки будет свой номер. Пойду думать

Добавлено через 20 часов 21 минуту
Смотрите, я попробовал так записать в переменную байты, в консоли все выводится очень долго(связано с кол-вом повторений в цикле) , байты все идут и идут. Что может тут не правильно? Кстати и не совсем правильно выводит.
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
int main(int argc, char ** argv)
{
    //открываем бинарный файл
    std::ifstream ifs("C:\\exe.exe", std::ios::binary);
 
    //формируем буфер из 512 байт
    PBYTE buf = new BYTE[512];
 
    //читаем 512 байт в буфер
    ifs.read((char*)buf, 512);
    string str2;
 
    stringstream s;
 
        for (int i = 0; i < 128; i++)
        {
            s << setw(2) << setfill('0') << hex << (int)buf[i];
            str2 = s.str();
            cout << str2;
        }
 
    delete[] buf;
    system("pause");
    ifs.close();
}
0
7789 / 6556 / 2984
Регистрация: 14.04.2014
Сообщений: 28,661
25.11.2015, 13:48 18
Nik-, это ты всё сигнатуры те делаешь? Зачем вообще преобразовывать бинарные данные в шестнадцатеричное текстовое представление? Просто посмотреть на них? Поиск последовательности байтов работает без всякого преобразования:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    std::ostringstream oss;
 
    std::ifstream ifs("c:\\exe.exe", std::ifstream::binary);
 
    oss << ifs.rdbuf();
 
    std::string data = oss.str(); // содержимое файла - в data
 
    ifs.close();
 
    char s[] = "\xC0\x2C\x00\x00\x10"; // последовательность, которую ищем: 0xC02C000010
    std::string ss;
    ss.resize(5);
    std::copy(s, s + 5, ss.begin()); // записать последовательность в string
 
    int p;
    if ((p = data.find(ss)) != std::string::npos)
        {
            // найдено в позиции p
        }
1
20 / 20 / 11
Регистрация: 12.07.2015
Сообщений: 350
25.11.2015, 15:39  [ТС] 19
Да, эти сигнатуры мне еще долго делать, проектная работа. Попробовал найти обычную сигнатуру 4a5d, определяющую, что файл 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
#include <iostream>
#include <string>
#include <sstream>
#include<fstream>
using namespace std;
 
 
int main()
{
    std::ostringstream oss;
 
    std::ifstream ifs("C:\\exe.exe", std::ifstream::binary);
 
    oss << ifs.rdbuf();
 
    std::string data = oss.str(); // содержимое файла - в data
 
    ifs.close();
    char s[] = "\x4d\x5a";// последовательность, которую ищем: 0xC02C000010
    std::string ss;
    ss.resize(5);
    std::copy(s, s + 5, ss.begin()); // записать последовательность в string
 
    int p;
    if ((p = data.find(ss)) != std::string::npos)
    {
        // найдено в позиции p
        cout << "Yes" << endl;
    }
 
 
    system("PAUSE");
    return 0;
}
1
7789 / 6556 / 2984
Регистрация: 14.04.2014
Сообщений: 28,661
25.11.2015, 17:26 20
Надо же корректировать длину. У меня 5 байт, а у тебя 2:
C++
1
2
3
4
    char s[] = "\x4d\x5a";// последовательность, которую ищем
    std::string ss;
    ss.resize(2);
    std::copy(s, s + 2, ss.begin()); // записать последовательность в string
1
25.11.2015, 17:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.11.2015, 17:26
Помогаю со студенческими работами здесь

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

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

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

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


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

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