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

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

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

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

22.11.2015, 20:33. Просмотров 1085. Ответов 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",...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Minchanin-Bel
5 / 5 / 1
Регистрация: 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
Nik-
20 / 20 / 9
Регистрация: 12.07.2015
Сообщений: 339
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
Minchanin-Bel
5 / 5 / 1
Регистрация: 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
Nik-
20 / 20 / 9
Регистрация: 12.07.2015
Сообщений: 339
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
Minchanin-Bel
5 / 5 / 1
Регистрация: 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
Nik-
20 / 20 / 9
Регистрация: 12.07.2015
Сообщений: 339
22.11.2015, 21:43  [ТС] #7
Задача - нужно из файла считать строку в переменную типа string, пусть эта строка будет abc. Следовательно s = abc. Дальше нужно создать еще переменную типа string ы2 и записать в нее 16 - ричное значение s,то есть abc. Переменная s2 будет иметь такой вид(к примеру, не знаю, как abc будет выглядить в 16-й с/c) - 45a50f. Ну а дальше вывести на экран.
0
Minchanin-Bel
5 / 5 / 1
Регистрация: 19.09.2010
Сообщений: 173
22.11.2015, 21:56 #8
Строка в файле - это шестнадцатеричное число или нет?
16 с/с содержит: 0123456789abcdef
Т.е. строка abc в файле будет представлена в num как 0x00000abc
0
Nik-
20 / 20 / 9
Регистрация: 12.07.2015
Сообщений: 339
22.11.2015, 22:03  [ТС] #9
Строка в файле - не число вообще. Это набор символов или букв. Например это - A string like "Hello World" to hex format: 48656C6C6F20576F726C64. Нашел на сайте. Слова типа Hello World будут в файле(ну или любые другие слова). Вообще, может я думаю не в правильном направлении. Мне надо вывести последовательность байт файла. Это из себя представляет 16-ричную строку, например - 48656C6C6F20576F726C64. Но обязательно все записывать в переменные типа string.
0
nmcf
5319 / 4639 / 1551
Регистрация: 14.04.2014
Сообщений: 18,452
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
Minchanin-Bel
5 / 5 / 1
Регистрация: 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
nmcf
5319 / 4639 / 1551
Регистрация: 14.04.2014
Сообщений: 18,452
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
Nik-
20 / 20 / 9
Регистрация: 12.07.2015
Сообщений: 339
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
WhiteP
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
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
Nik-
20 / 20 / 9
Регистрация: 12.07.2015
Сообщений: 339
23.11.2015, 19:56  [ТС] #15
Вооот, то что надо, спасибо огромное А не могли бы Вы пояснить все строчки кода, пожалуйста. Буду благодарен.

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

Добавлено через 1 минуту
Все усложняется из-за алгоритма поиска подстроки, который поддерживает только string
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2015, 19:56
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.11.2015, 19:56
Ответ Создать тему
Опции темы

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