Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> конвертация из hex в char 
:(
    Опции темы
admsasha
Дата 11.1.2012, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



есть массив hex значений вида
std:string data="656667686970";
Нужно из этого получить тот же std::string со символами. std::string result="abcdef"


Как сделать преобразование из int a=65 я знаю, но как string "F4" или "DB" в этот int правильно сконвертить не знаю.


PM MAIL WWW ICQ Jabber   Вверх
borisbn
Дата 11.1.2012, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



itoa последним параметром ставишь 16


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
admsasha
Дата 11.1.2012, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Код

This function is not defined in ANSI-C and is not part of C++, but is supported by some compilers.

У меня,например, не поддерживается.  (gcc версия 4.4.1)

Добавлено через 12 минут и 19 секунд
Пока сделал через sscanf

Код

int decimalValue=0;
sscanf(hex.c_str(), "%x", &decimalValue);


в hex читаю по два символа из строки
PM MAIL WWW ICQ Jabber   Вверх
bsa
Дата 11.1.2012, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Как-то так (без проверок на ошибки):
Код
for(int i = 0, s = data.size(); i < s; ++i) {
   char c = toupper(data[i]);
   c -= (c > '9') ? 'A' - 10 : '0';
   if ( (i % 2) == 0)
     result.push_back(c << 4);
   else
     result.back() |= c;
}


Это сообщение отредактировал(а) bsa - 11.1.2012, 13:09
PM   Вверх
admsasha
Дата 11.1.2012, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



ой, что-то сильно сложно. data - это std::string ?, Но на сколько я помню порядок символов не гарантируются (могу ошибаться), так что использовать data[i] нельзя

хорошо, чем вот такой код плох ?
Код

    string hexData="2A6444C9AC";
    int decimalValue = 0;
    string result="";

    for (int i=0;i<hexData.length();i=i+2){
        sscanf(hexData.substr(i,2).c_str(), "%x", &decimalValue);
        result.append(string(1,decimalValue));
    }
    cout << result << endl;

PM MAIL WWW ICQ Jabber   Вверх
borisbn
Дата 11.1.2012, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(admsasha @  11.1.2012,  17:46 Найти цитируемый пост)
 чем вот такой код плох ?

http://liveworkspace.org/code/5b3ff759aa91...7407b4ee7afe975
это то, что ты хотел ?
скажи, что именно в результате должно получиться в строке result исходя из твоего же примера
Цитата(admsasha @  11.1.2012,  17:46 Найти цитируемый пост)
string hexData="2A6444C9AC";


символ с кодом 0x2A, затем символ с кодом 0x64, затем символ с кодом 0x44 и т.п. ?
если да, то код вроде правильный, за исключением того, что если в исходной строке будет 0x00, то все дальнейшие символы будут проигнорированы



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
bsa
Дата 11.1.2012, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(admsasha @  11.1.2012,  18:46 Найти цитируемый пост)
ой, что-то сильно сложно. data - это std::string ?, Но на сколько я помню порядок символов не гарантируются (могу ошибаться), так что использовать data[i] нельзя
что тут сложного? напиши комментарии и все станет очевидно
этот код на основе твоего в первом посте. названия переменных те же.
порядок символов чего? почему нельзя использовать data[i]? ты что-то с чем-то путаешь. если у объекта метод/оператор есть, значит его можно использовать.
И этот код работает
PM   Вверх
admsasha
Дата 12.1.2012, 02:03 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Цитата(borisbn @  12.1.2012,  01:03 Найти цитируемый пост)
http://liveworkspace.org/code/5b3ff759aa91...7407b4ee7afe975это то, что ты хотел ?

Да, вывод правильный. Известно, что 0x00 не будет.

Цитата(bsa @  12.1.2012,  05:07 Найти цитируемый пост)
порядок символов чего? почему нельзя использовать data[i]? ты что-то с чем-то путаешь. если у объекта метод/оператор есть, значит его можно использовать.

http://lib.rus.ec/b/191841/read
Вот это имелось введу...
Код
Во-первых, контейнер string не гарантирует хранения данных в непрерывном блоке памяти;



PM MAIL WWW ICQ Jabber   Вверх
borisbn
Дата 12.1.2012, 08:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(admsasha @  12.1.2012,  02:03 Найти цитируемый пост)
контейнер string не гарантирует хранения данных в непрерывном блоке памяти

а где ты видишь у bsa требование к непрерывности данных ???
оператор [] гарантирует, что он вернёт i-й элемент. Что и требовалось


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
admsasha
Дата 12.1.2012, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



borisbn, Я сразу указал, что не уверен в этом, просто читал о чем-то подобном. Можно тогда уточнить, это имеется введу. Когда это проявит себя?
PM MAIL WWW ICQ Jabber   Вверх
borisbn
Дата 12.1.2012, 09:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(admsasha @  12.1.2012,  09:00 Найти цитируемый пост)
 Можно тогда уточнить, это имеется введу. Когда это проявит себя?

Код
string str = "01234";
char * c = & str[ 3 ];

в этом случае c[ 1 ] совершенно необязательно будет указывать на 4.
Если же сделать так
Код
string str = "01234";
char * c = & str.c_str()[ 3 ];

то всё будет OK, т.к. c_str() уже гарантирует непрерывность строки


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
bsa
Дата 12.1.2012, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



То что string не гарантирует это только в документации написано. На самом деле реализовать стринг через тот же deque будет совсем нетривиально, потому что c_str() является константным методом. Т.е. внутри стринга кроме хранилища символов должен быть еще и mutable указатель на область памяти, куда будет пихаться результат работы c_str()... Я очень сильно сомневаюсь, что кто-то будет так реализовывать. Значительно проще сделать в непрерывной области и с 0-м на конце. В этом случае c_str() имеет константную сложность.
Но это так, отступление. Если в документации не написано, что "непрерывность гарантируется" (как для vector) или написано обратное, то надеяться на "авось" нельзя.
PM   Вверх
borisbn
Дата 12.1.2012, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(bsa @  12.1.2012,  10:40 Найти цитируемый пост)
Я очень сильно сомневаюсь, что кто-то будет так реализовывать

Честно признаться, сам не проверял, а поверил volatile в этой теме (вернее вот это сообщение)


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
xvr
Дата 12.1.2012, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(bsa @  12.1.2012,  10:40 Найти цитируемый пост)
То что string не гарантирует это только в документации написано.

Видел где то реализацию string, которая хранила последовательность сегментов символов (ну и до кучи реализовавала COW). Реализация была направленна на эффективную работу с арифметикой строк (конкатенация и выделение подстрок).

PM MAIL   Вверх
500mhz
Дата 12.1.2012, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



эх а на асме эта конверсия в пару строчек получится

написать? )))


--------------------

PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0586 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.