ASCII2HEX

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

  1. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Есть переменная, которая содержит 16-ричное значение записанное в виде ASCII строки. Задача - перевести это строчное ASCII значение в 16ричный вид

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

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

    Rockphorr Well-Known Member

    Публикаций:
    0
    думаю что посимвольно в цикле
    байт - 2 символа следовательно
    двойное слово 8 символов

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

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

    Clerk Забанен

    Публикаций:
    0
    JCronuz
    masm32.lib, htodw().
     
  4. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Clerk
    тоже вариант - я масм пакадж не разбирал
     
  5. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    JCronuz
    ради развлечения напишу свой 16 разрядный вариантик 4 символа в слово
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Код (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
    Rockphorr не лучше готовое решение :)
    Clerk Спасибо то что нужно.
     
  8. qqwe

    qqwe New Member

    Публикаций:
    0
    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
    qqwe
    Одна поправочка:
    else if(c >= 'A' && c <= 'F')
    i += c - 'A'+10;
     
  10. JCronuz

    JCronuz New Member

    Публикаций:
    0
    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
    Все кажись разобрался:

    Код (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
    Интересно, а как ты это скомпилешь в натив х64?) Мой совет - то что можно сделать на пуре Си лучше на нём и делать, выходной код всё равно по скорости будет такой же как и на чистом асме если не быстрее за счёт оптимизаций компилера.
     
  13. qqwe

    qqwe New Member

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

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

    qqwe New Member

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

    AsmGuru62 Member

    Публикаций:
    0
  16. qqwe

    qqwe New Member

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

    Asterix New Member

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

    JCronuz New Member

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

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

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

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

    d2k9 Алексей

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