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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,974
Записей в блоге: 27
#1

Перевод hex в char - C++

27.01.2014, 16:21. Просмотров 1828. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перевод hex в char (C++):

convert char to hex - C++
Здравствуйте. Подскажите пожалуйста как преобразовать строку в hex? То есть имеем функцию convert(char param) { return hex; }

Hex в unsigned char - C++
Здравствуйте! У меня есть одна проблема, которую не могу решить, ну вот, у меня есть файл в нем hex строка, такого вида: 68 65 6c 6c 6f...

Как выводить char в hex? - C++
Доброго времени суток! Как через cout выводить char в hex? Нужно для криптографической библиотеки. Заранее спасибо :)

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

Hex коды символов из char* в стринг - C++
Добрый день. Голову себе сломал, гуглил. Все без толку. Есть массив символов (char*). Мне нужно получить строку std::string отображающую...

Перевести char* или byte* в Hex-строку - C++
Собственно сабж. А ситуация такая: Есть функция принимающая толи char* толи BYTE* и мне нужно перевести этот массив в HEX-строку, при чом...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
0x10
2463 / 1635 / 238
Регистрация: 24.11.2012
Сообщений: 4,022
27.01.2014, 16:29 #2
delete, прогнал
0
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,974
Записей в блоге: 27
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
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,974
Записей в блоге: 27
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!
1519 / 1222 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
27.01.2014, 17:25 #6
Тамика, char -> unsigned char.
Битовые операции над знаковыми числами лучше вообще не проводить, на всякий)
1
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,974
Записей в блоге: 27
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!
1519 / 1222 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
27.01.2014, 17:37 #8
Цитата Сообщение от Тамика Посмотреть сообщение
Почему я не могу создать строку std::string result = str[2*i] + str[2*i + 1]; ?.. Почему так нельзя?
Потому что результат сложения двух символов - это число типа int, а у класса string нет ни подходящего оператора =, ни подходящего неявного конструктора преобразования.
1
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,974
Записей в блоге: 27
27.01.2014, 17:41  [ТС] #9
Цитата Сообщение от gray_fox Посмотреть сообщение
Потому что результат сложения двух символов - это число типа int, а у класса string нет ни подходящего оператора =, ни подходящего неявного конструктора преобразования.
Понэл.
0
Tulosba
:)
Эксперт С++
4395 / 3238 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,974
Записей в блоге: 27
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!
1519 / 1222 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 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
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,974
Записей в блоге: 27
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!
1519 / 1222 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 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
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,974
Записей в блоге: 27
27.01.2014, 17:54  [ТС] #15
Цитата Сообщение от gray_fox Посмотреть сообщение
Т.е. лучше так тогда:
C++
1
std::string bin(&str[2*i], &str[2*i] + 2);
Вот этот вариант выбрала и он как раз работает, как нужно! Ещё раз спасибо.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2014, 17:54
Привет! Вот еще темы с ответами:

Число int перевести в hex и хранить в char - C++
Есть число в десятичном формате, допустим int a. Необходимо его в Hex формате положить в char. Рассматриваются только те случаи когда...

Как сделать, чтобы в char было hex число - C++
ввод числа int s; cin &gt;&gt;s; char z=? как сделать чтобы в char z было hex число, то есть если s=15 z=0xF

Перевод string в hex - C++
Как перевести букву в шестнадцатеричный вид. Например: Г - это 0xC3; Получилось следующее: QString str = &quot;ПРИВЕТ&quot;; ...

Перевод данных в hex. - C++
Всем привет! char buffs = {&quot;\x01\x7f\x34\xb0\x80&quot;}; printf(&quot;%02X \n&quot;,buffs); // выводит 01 printf(&quot;%02X \n&quot;,buffs); // выводит 7F ...


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

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

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