Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/12: Рейтинг темы: голосов - 12, средняя оценка - 4.67
Тамика
Котовчанин
918 / 462 / 195
Регистрация: 16.02.2010
Сообщений: 3,264
Записей в блоге: 31
#1

Перевод hex в char

27.01.2014, 16:21. Просмотров 2151. Ответов 16
Метки нет (Все метки)

Добрый день! Снова с вопросом, дорогие форумчане.
Есть задание - получаю строку, в которой хексовое число. Например "е8". Нужно из нее сделать один байт хексовый е8.
Вот моя программа.
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
#include <iostream>
#include <vector>
 
char string_to_hex(const char& hex)
{
    char c = hex;
    if(( hex >= '0')&&(hex <= '9')){
        c = hex - '0';
        return c;}
    if(( hex >= 'A')&&(hex <= 'F')){
        c = hex - 'A' + 10;
        return c;}
    if(( hex >= 'a')&&(hex <= 'f')){
        c = hex - 'a' + 10;
        return c;}
}
 
std::vector <char> converter (const std::string& str)
{
    std::vector <char> result;
    result.reserve(str.size() / 2);
    for (int i = 0; i < str.size()/2; ++i)
        result.push_back(((string_to_hex(str[2*i])) << 4) | string_to_hex(str[2*i + 1]));
 
    return result;
}
 
int main()
{
    std::string str = "e8";
    std::vector<char> result = converter(str);
    for (int i = 0; i < result.size(); ++i)
        std::cout << static_cast<unsigned int>(result[i])<< std::endl;
 
    system("pause");
}
Функция string_to_hex возвращает всё верно. Но вот с пушем в вектор проблема... Я пока не сильно в этом разбираюсь, но по идее строка ((string_to_hex(str[2*i])) << 4) | string_to_hex(str[2*i + 1]) должна соединять два значения в одно. Но выводит какое-то левое огромное число! Помогите, пожалуйста! Буду очень благодарна.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2014, 16:21
Ответы с готовыми решениями:

convert char to hex
Здравствуйте. Подскажите пожалуйста как преобразовать строку в hex? То есть...

Hex в unsigned char
Здравствуйте! У меня есть одна проблема, которую не могу решить, ну вот, у меня...

HEX in char[] to int or DWORD
Здравия всем! Я считал 4 байта из файла, и запихнул их в char: \xFE \x00...

Конвертация ' string hex ' to char
добрый день не могу понять как преобразовать последовательность char в string...

Как выводить char в hex?
Доброго времени суток! Как через cout выводить char в hex? Нужно для...

16
0x10
2571 / 1751 / 288
Регистрация: 24.11.2012
Сообщений: 4,377
27.01.2014, 16:29 #2
delete, прогнал
0
Тамика
Котовчанин
918 / 462 / 195
Регистрация: 16.02.2010
Сообщений: 3,264
Записей в блоге: 31
27.01.2014, 16:30  [ТС] #3
Цитата Сообщение от 0x10 Посмотреть сообщение
delete, прогнал
Потому что я ввела только два символа. А программу хочу сделать всё таки с рассчетом на большее количество символов, которое будет разбиваться по два.

Добавлено через 37 секунд
Цитата Сообщение от 0x10 Посмотреть сообщение
delete, прогнал
Бывает.
0
ляга
Заблокирован
27.01.2014, 16:33 #4
C++
1
2
std::string sourceStrByte = "e8";               
unsigned char result = (unsigned char) strtol(sourceStrByte.c_str(), NULL, 16);
1
Тамика
Котовчанин
918 / 462 / 195
Регистрация: 16.02.2010
Сообщений: 3,264
Записей в блоге: 31
27.01.2014, 17:15  [ТС] #5
Цитата Сообщение от ляга Посмотреть сообщение
C++
1
2
std::string sourceStrByte = "e8";               
unsigned char result = (unsigned char) strtol(sourceStrByte.c_str(), NULL, 16);
Спасибо! Но нужно вручную.
0
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
27.01.2014, 17:25 #6
Тамика, char -> unsigned char.
Битовые операции над знаковыми числами лучше вообще не проводить, на всякий)
1
Тамика
Котовчанин
918 / 462 / 195
Регистрация: 16.02.2010
Сообщений: 3,264
Записей в блоге: 31
27.01.2014, 17:28  [ТС] #7
Учла.
А не подскажите ещё, пожалуйста, что за фигня со строками.
Есть у меня строка std::string str = "abc";
Почему я не могу создать строку std::string result = str[2*i] + str[2*i + 1]; ?.. Почему так нельзя?
В цикле, естественно.
0
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
27.01.2014, 17:37 #8
Цитата Сообщение от Тамика Посмотреть сообщение
Почему я не могу создать строку std::string result = str[2*i] + str[2*i + 1]; ?.. Почему так нельзя?
Потому что результат сложения двух символов - это число типа int, а у класса string нет ни подходящего оператора =, ни подходящего неявного конструктора преобразования.
1
Тамика
Котовчанин
918 / 462 / 195
Регистрация: 16.02.2010
Сообщений: 3,264
Записей в блоге: 31
27.01.2014, 17:41  [ТС] #9
Цитата Сообщение от gray_fox Посмотреть сообщение
Потому что результат сложения двух символов - это число типа int, а у класса string нет ни подходящего оператора =, ни подходящего неявного конструктора преобразования.
Понэл.
0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
27.01.2014, 17:42 #10
Цитата Сообщение от Тамика Посмотреть сообщение
std::string result = str[2*i] + str[2*i + 1];
Попробуйте так:
C++
1
std::string result = std::string(1, str[2*i]) + std::string(1, str[2*i + 1]);
0
Тамика
Котовчанин
918 / 462 / 195
Регистрация: 16.02.2010
Сообщений: 3,264
Записей в блоге: 31
27.01.2014, 17:43  [ТС] #11
Цитата Сообщение от Tulosba Посмотреть сообщение
Попробуйте так:
C++
1
std::string result = std::string(1, str[2*i]) + std::string(1, str[2*i + 1]);
Я почти так и сделала, только проще.
std::string bin = std::string (str[2*i], str[2*i + 1]);
0
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
27.01.2014, 17:47 #12
Цитата Сообщение от Тамика Посмотреть сообщение
std::string bin = std::string (str[2*i], str[2*i + 1]);
И как, работает?) Первый символ будет интепретироваться как количество второго символа
Можно ещё так
C++
1
std::string bin = std::string(&str[2*i], &str[2*i] + 2);
или так, если есть списки инициализации
C++
1
std::string bin = {str[2*i], str[2*i + 1]};
1
Тамика
Котовчанин
918 / 462 / 195
Регистрация: 16.02.2010
Сообщений: 3,264
Записей в блоге: 31
27.01.2014, 17:51  [ТС] #13
Цитата Сообщение от gray_fox Посмотреть сообщение
И как, работает?) Первый символ будет интепретироваться как количество второго символа
Можно ещё так
C++
1
std::string bin = std::string(&str[2*i], &str[2*i] + 2);
или так, если есть списки инициализации
C++
1
std::string bin = {str[2*i], str[2*i + 1]};
Ха-ха, вот странно. Общий результат выдало правильный, но Вы правы - нафигачило мне тучу восьмерок.
0
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
27.01.2014, 17:53 #14
Лучший ответ Сообщение было отмечено Тамика как решение

Решение

Цитата Сообщение от gray_fox Посмотреть сообщение
C++
1
std::string bin = std::string(&str[2*i], &str[2*i] + 2);
Т.е. лучше так тогда:
C++
1
std::string bin(&str[2*i], &str[2*i] + 2);
Добавлено через 2 минуты
Цитата Сообщение от Тамика Посмотреть сообщение
Ха-ха, вот странно. Общий результат выдало правильный, но Вы правы - нафигачило мне тучу восьмерок.
См. тут (2) char неявно приводится к std::string::size_type.
1
Тамика
Котовчанин
918 / 462 / 195
Регистрация: 16.02.2010
Сообщений: 3,264
Записей в блоге: 31
27.01.2014, 17:54  [ТС] #15
Цитата Сообщение от gray_fox Посмотреть сообщение
Т.е. лучше так тогда:
C++
1
std::string bin(&str[2*i], &str[2*i] + 2);
Вот этот вариант выбрала и он как раз работает, как нужно! Ещё раз спасибо.
0
Somebody
2799 / 1610 / 251
Регистрация: 03.12.2007
Сообщений: 4,213
Завершенные тесты: 3
27.01.2014, 17:58 #16
Когда str - string, есть ещё
C++
1
std::string(str, 2*i, 2);
0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
27.01.2014, 18:09 #17
Не заметил сразу, что символы подряд идут. Тогда я бы сделал например так:
C++
1
std::string result = std::string( &str[2*i], 2 );
P.S. или как Somebody
0
27.01.2014, 18:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2014, 18:09

Hex коды символов из char* в стринг
Добрый день. Голову себе сломал, гуглил. Все без толку. Есть массив символов...

Получить int hex число из char
Всем привет. Знаю, тема наверное заезженная, но не могу найти нужную...

Запись в файл char строки в hex'e
Имеется файл, в нем несколько строк, в каждой строке заданное количество...


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

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

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