Модераторы: 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   Вверх
volatile
Дата 13.1.2012, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(500mhz @  12.1.2012,  15:16 Найти цитируемый пост)
на асме эта конверсия в пару строчек получится
написать?
Если реально в пару строчек, то да, напишите.  smile
Да, не. Шучу.

Цитата(borisbn @  12.1.2012,  11:16 Найти цитируемый пост)
 сам не проверял, а поверил volatile в этой теме

да не проверял я ничего, прямо так уж систематически. я просто хотел сказать, что этому придают слишком большую значимость,
то есть мифическая угроза, отвлекает от рельных проблем.
И этот топик, еще одно тому подтверждение.
В коде bsa, нет и намёка на неправильное использование стринга, однако, запуганные этой мифической угрозой программеры, пытаются найти черную кошку в черной комнате, которой там нет. smile 

Еще одна такая проблема big-endian/little-endian. Один знакомый программер очень озабочен был этой проблемой вычитанной у страуструпа, или еще у кого-то из патриархов. Причем писал он исключительно под венду. Я ему говорю, что венда не работает на биг-ендиен, и типа расслабсья.. Но он ни в какую не верил.  smile.
Можно конечно сказать, что это хорошо, и что его код, при необходимости легче будет перенести на биг-едниен, если такая задача возникнет. Но такая задача никогда не возникнет, просто потому-что есть еще 100000001 причина, по которой код не будет работать нигде кроме венды. Так зачем тогда тратить столько сил именно на на этот ендиен, как будто нет других проблем...
эх, ладно, щас опять скажут что я подрываю устои платформанезависимого програмирования....


Это сообщение отредактировал(а) volatile - 13.1.2012, 01:42
PM MAIL   Вверх
500mhz
Дата 13.1.2012, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


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

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



Код

        mov al,"D"
        btc eax,5 - коректируем регистр букавок
        bt eax,6
        jnc .next
        sub eax,0xd
.next:
        aaa                  


в AL заносим наш char - 0,1,2,3,4,5,6.7.8.9 - A,B,C,D,F (регистр значения не имеет, коректируем там по ходу)
на выходе в AL бинарное значение 

то есть в примере заносим в AL код буковки D (ascii) = 0x44 или 0x64 в зависимости от регистра
на выходе в AL получаем бинарное значение = 0xD


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

PM MAIL ICQ   Вверх
bsa
Дата 13.1.2012, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



500mhz, интересно, а во что тогда компилятор превратит:
Код
extern int getchar(void);
extern void putchar(char c);
int main()
{
   char c = getchar();
   c -= (c > '9') ? 'A' - 10 : '0';
   putchar(c);
}

gcc (gcc -O1 -c -S prog.c -o prog.S) меня удивил:
Код
        call    _getchar
    movsbl    %al,%edx
    cmpb    $57, %al
    jle    L2
    movb    %dl, %al
    subb    $55, %al
    jmp    L3
L2:
    movb    %dl, %al
    subb    $48, %al
L3:
    movsbl    %al,%eax
    movl    %eax, (%esp)
    call    _putchar
    leave
    ret

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


шайтан
***


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

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



видимо компилятор не знает о битовых операциях и BCD арифметике )))


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

PM MAIL ICQ   Вверх
bsa
Дата 13.1.2012, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(500mhz @  13.1.2012,  21:48 Найти цитируемый пост)
видимо компилятор не знает о битовых операциях и BCD арифметике ))) 

кстати, а ты уверен в корректности использования "ASCII Adjust After Addition" после операции вычитания?
PM   Вверх
500mhz
Дата 13.1.2012, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


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

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



а что не правильно работает разве?


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

PM MAIL ICQ   Вверх
volatile
Дата 14.1.2012, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(bsa @  13.1.2012,  21:37 Найти цитируемый пост)
ты уверен в корректности использования "ASCII Adjust After Addition" после операции вычитания? 

еще более интересен вопрос о корректности ААА, без операции вычитания. 
Там по другому разветвлению, вообще ни одна комманда не влияет на флаг AF
сдедовательно результат будет зависеть от кода который расположен выше, и который здесь не приведен.

от фазы луны, другими словами.
 smile

Добавлено через 9 минут и 44 секунды
Цитата(500mhz @  13.1.2012,  12:58 Найти цитируемый пост)
        mov al,"D"
        btc eax,5 - коректируем регистр букавок
        bt eax,6
        jnc .next
        sub eax,0xd
.next:
        aaa                 


500mhz, Вот перед этим вашим кодом добавьте што-нибудь влияющее на флаг AF,
например:
        mov al, 7
        add al, 9
 и сможете сами ответить на сакроментальный вопрос 
Цитата(500mhz @  13.1.2012,  21:48 Найти цитируемый пост)
а что не правильно работает разве? 



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


шайтан
***


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

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



volatile

код как бэ намекает что в начале должно быть xor eax,eax для соблюдений правил "техники безопасности"

Код

        xor eax,eax
        mov al,"D"
        btc eax,5 - коректируем регистр букавок
        bt eax,6
        jnc .next
        sub eax,0xd
.next:
        aaa         


Добавлено через 4 минуты и 12 секунд
по поводу "корректности" команд, есть неописуемый случай (уже классика)

Код

cmp eax, ebx
sbb ecx, ecx


тоже не корректное использование cmp ?


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

PM MAIL ICQ   Вверх
volatile
Дата 14.1.2012, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(500mhz @  14.1.2012,  10:29 Найти цитируемый пост)
cmp eax, ebx
sbb ecx, ecx
тоже не корректное использование cmp ? 
Не вижу никакой связи с предыдущим кодом, и разбирать его это уже полный оффтоп.
Вернемся к нашим баранам.

Для сравнения, код 
Цитата(bsa @  13.1.2012,  14:12 Найти цитируемый пост)
  c -= (c > '9') ? 'A' - 10 : '0';

откомпилированный студией:
Код

cmp     al, 39h
setle   cl
dec     cl
and     cl, 7
add     cl, 30h
sub     al, cl

по-ходу студия еще и без условных переходов сделала. (условнй переход == лишний тормоз)

Это примерно,  тот-же участок, что и ваш:
Цитата(500mhz @  14.1.2012,  10:29 Найти цитируемый пост)
        xor eax,eax
        mov al,"D"
        btc eax,5 - коректируем регистр букавок
        bt eax,6
        jnc .next
        sub eax,0xd
.next:
        aaa         

Цитата(500mhz @  12.1.2012,  15:16 Найти цитируемый пост)
эх а на асме эта конверсия в пару строчек получится

э... не вижу, прямо так уж ошеломляющих преимуществ асма, даже на таком простом коде. 
а уж вероятность ошибиться, как мы и убедились, в разы больше.
smile



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


шайтан
***


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

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



Цитата

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

интересно где это я ошибся? 

пс
разве топик называеться АSM VS C ?


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

PM MAIL ICQ   Вверх
volatile
Дата 15.1.2012, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(500mhz @  14.1.2012,  23:51 Найти цитируемый пост)
интересно где это я ошибся? 

почитайте выше, ваш первый код содержал ошибку.
вы ее исправили, (добавив xor).
это кстати вовсе не очевидная ошибка, и при отладке и тестировании она наверняка не всплывет.
а всплывет где-то потом, у юзера, и то по редким стечениям обстоятельств.
(такой тип ошибок, я считаю самыми мерзкими.)

Цитата(500mhz @  14.1.2012,  23:51 Найти цитируемый пост)
разве топик называеться АSM VS C ? 

так вы же сами предложили.  smile 
PM MAIL   Вверх
bsa
Дата 15.1.2012, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



круто студия оптимизировала (не знал про операцию set*). В итоге код получился:
Код
char convert(char al)
{
   char cl = (al <= '9');
   --cl;  //cl = 0x00 или 0xff
   cl &= 0x07; //cl = 0x00 или 7
   cl = cl + '0'; //cl = '0' + 7 или '0' + 0
   al -= '0';
   return al;
}


Это сообщение отредактировал(а) bsa - 15.1.2012, 17:51
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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