ASCII2HEX

Тема в разделе "WASM.BEGINNERS", создана пользователем JCronuz, 22 фев 2010.

  1. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Есть переменная, которая содержит 16-ричное значение записанное в виде ASCII строки. Задача - перевести это строчное ASCII значение в 16ричный вид

    Код (Text):
    1. char asciiHexVal = "14ABEF";
    На выходе надо получить

    Код (Text):
    1. int hexValue = 14ABEF;
     
  2. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    думаю что посимвольно в цикле
    байт - 2 символа следовательно
    двойное слово 8 символов

    алгос примерно такой
    вычисляем длину строки
    идем от младшего с старшему, результат в начале инициализирован нулями
    в цикле берем символ, проверяем, конвертируем записываем

    +проверки на длину строки если больше 8 отбрасываем старшие разряды или генерим ошибку
    если меньше не трогаем старшие нули
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    JCronuz
    masm32.lib, htodw().
     
  4. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    Clerk
    тоже вариант - я масм пакадж не разбирал
     
  5. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    JCronuz
    ради развлечения напишу свой 16 разрядный вариантик 4 символа в слово
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Код (Text):
    1. ; by Alexander Yackubtchik
    2. htodw proc String:DWORD
    3.  
    4.   ; -----------------------------------
    5.   ; Convert hex string into dword value
    6.   ; Return value in eax
    7.   ; -----------------------------------
    8.  
    9.     push ebx
    10.     push esi
    11.     push edi
    12.  
    13.     mov edi, String
    14.     mov esi, String
    15.  
    16.      ALIGN 4
    17.  
    18.   again:  
    19.     mov al,[edi]
    20.     inc edi
    21.     or  al,al
    22.     jnz again
    23.     sub esi,edi
    24.     xor ebx,ebx
    25.     add edi,esi
    26.     xor edx,edx
    27.     not esi             ;esi = lenth
    28.  
    29.   .while esi != 0
    30.     mov al, [edi]
    31.     cmp al,'A'
    32.     jb figure
    33.     sub al,'a'-10
    34.     adc dl,0
    35.     shl dl,5            ;if cf set we get it bl 20h else - 0
    36.     add al,dl
    37.     jmp next
    38.   figure:
    39.     sub al,'0'
    40.   next:  
    41.     lea ecx,[esi-1]
    42.     and eax, 0Fh
    43.     shl ecx,2           ;mul ecx by log 16(2)
    44.     shl eax,cl          ;eax * 2^ecx
    45.     add ebx, eax
    46.     inc edi
    47.     dec esi
    48.   .endw
    49.  
    50.     mov eax,ebx
    51.  
    52.     pop edi
    53.     pop esi
    54.     pop ebx
    55.  
    56.     ret
    57.  
    58. htodw endp
     
  7. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Rockphorr не лучше готовое решение :)
    Clerk Спасибо то что нужно.
     
  8. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    char c, *pstr, *str = "14ABEF";
    int i;
    for(pstr = str, i = 0; *pstr; pstr++){
    c = *pstr;
    i *= 16;
    if(c >= '0' && c <= '9')
    i += c - '0';
    else if(c >= 'A' && c <= 'F')
    i += c - 'A';
    else
    break;
    }

    int hexValue = i;
     
  9. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    qqwe
    Одна поправочка:
    else if(c >= 'A' && c <= 'F')
    i += c - 'A'+10;
     
  10. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    qqwe мой первый вариант решения этой странной задачи был

    Код (Text):
    1.     for (int i=0; i<strlen(val); ++i)
    2.     {  
    3.         ch = val[i];
    4.            
    5.  
    6.         Break;
    7.         // 0..9
    8.         if ( ch >= '0' && ch <= '9' )
    9.         {
    10.             ch = ch - '0';  // 0x30
    11.             indexes[i] = ch;
    12.             continue;
    13.         }
    14.  
    15.         // A..F (41..46)
    16.         if ( ch >= 'A' && ch <= 'F' )
    17.         {
    18.             ch = ch - 'A' + 10;
    19.             indexes[i] = ch;
    20.         }
    21.     }
    22.  
    23.     for (int y=0; y<5; y++)
    24.     {
    25.         std::cout << indexes[y] << endl;
    26.     }
    27.  
    28.     getch();
    Но я подумал, что есть готовое решение :)
     
  11. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Все кажись разобрался:

    Код (Text):
    1. __declspec( naked ) void htodw(char *pData)
    2. {
    3.       __asm{
    4.         push ebp
    5.         mov ebp, esp
    6.         push ebx
    7.         push esi
    8.         push edi
    9.         mov edi, dword ptr ss:[ebp+8]
    10.         mov esi, dword ptr ss:[ebp+8]
    11.         nop
    12.  
    13. __1:
    14.  
    15.         mov al, byte ptr ds:[edi]
    16.         inc edi
    17.         or al, al
    18.         jnz __1
    19.         sub esi, edi
    20.         xor ebx, ebx
    21.         add edi, esi
    22.         xor edx, edx
    23.         not esi
    24.         jmp __End                
    25.  
    26. __2:
    27.  
    28.         mov al, byte ptr ds:[edi]
    29.         cmp al, 041h
    30.         jb __3                  
    31.         sub al, 057h
    32.         adc dl, 0
    33.         shl dl, 5
    34.         add al, dl
    35.         jmp __4                
    36.  
    37. __3:
    38.  
    39.         sub al, 030h
    40.  
    41. __4:
    42.  
    43.         lea ecx, dword ptr ds:[esi-1]
    44.         and eax, 0Fh
    45.         shl ecx, 2
    46.         shl eax, cl
    47.         add ebx, eax
    48.         inc edi
    49.         dec esi
    50.  
    51. __End:
    52.  
    53.         or esi, esi
    54.         jnz __2                
    55.         mov eax, ebx
    56.         pop edi
    57.         pop esi
    58.         pop ebx
    59.         leave
    60.         mov res, eax
    61.         retn                        
    62.         }
    63. }
    64.  
    65.  
    66. int main(int argc, char* argv[])
    67. {
    68. __asm int 3
    69.     htodw("14ABEF");
    70.     printf("%X", res);
    71.  
    72.     return 0;
    73. }
     
  12. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    Интересно, а как ты это скомпилешь в натив х64?) Мой совет - то что можно сделать на пуре Си лучше на нём и делать, выходной код всё равно по скорости будет такой же как и на чистом асме если не быстрее за счёт оптимизаций компилера.
     
  13. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    KeSqueer
    принимается. задача такого рода, что даже не перечитывал

    JCronuz
    на х86 асме можно раза в 2 короче. можно даже операторов в 7.
     
  14. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    d2k9
    или в уникод? такой сурьезный алгос можно и под каждый проц переписывать. вопрос только - зачем его вообще на асме писать, если только вся прога не на асме?
     
  15. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
  16. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    AsmGuru62
    а зачем? кроме того, работа с памятью перекроет почти любой оверхед в алгосе или реализации. и ее особо не ускоришь
    ну да, но может челу это не для С надо?
     
  17. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    иногда перед созданием темы неплохо и по форуму поискать
    http://wasm.ru/forum/viewtopic.php?id=10473
     
  18. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    AsmGuru62 Мне нельзя использовать scanf, так как консоль используется мной только для вывода результата, а алгоритм нужен был для другого.

    Asterix
    Искал подобные темы, нашлось 3 листа из которых пролистал один да и забил. А тема очень полезная для меня спасибо.
     
  19. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    701
    есть старая зомбы тулза на сайте его паищи
     
  20. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    А я что, по-твоему, предлагаю писать на асме? Я ведь написал что на пуре Си лучше.