Функции для перевода из шестнадцетиричного формата в иной.

Тема в разделе "WASM.RESEARCH", создана пользователем slava2006, 1 ноя 2005.

  1. slava2006

    slava2006 New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2005
    Сообщения:
    16
    Адрес:
    Russia
    Есть ли где-нибудь готовые ?

    Лучше на С.



    Нужен обычный вещественный формат double precision (qword 64 бит = 8 байт), различные целые итп.
     
  2. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    Перевод 16-ой числа из строки в число 10-ное:
    Код (Text):
    1.  
    2. function StrHexToInt(s: string): Integer;
    3. var
    4.   i, n, b: Integer;
    5.   function Exponentation(num, level: Integer): Integer;
    6.   begin
    7.     case level of
    8.       0: Result := 1;
    9.       1: Result := num;
    10.     else
    11.       Result := num*Exponentation(num, level - 1);
    12.     end;
    13.   end;
    14.   function GetNumByChar(c: char): Integer;
    15.   begin
    16.     case c of
    17.      '0': Result := 0;
    18.      '1': Result := 1;
    19.      '2': Result := 2;
    20.      '3': Result := 3;
    21.      '4': Result := 4;
    22.      '5': Result := 5;
    23.      '6': Result := 6;
    24.      '7': Result := 7;
    25.      '8': Result := 8;
    26.      '9': Result := 9;
    27.      'A': Result := 10;
    28.      'B': Result := 11;
    29.      'C': Result := 12;
    30.      'D': Result := 13;
    31.      'E': Result := 14;
    32.      'F': Result := 15;
    33.     else
    34.       Result := -1;
    35.     end;
    36.   end;
    37. begin
    38.   s := UpperCase(s);
    39.   n := length(s);
    40.   if n > 8 then
    41.   begin
    42.     Result := -1;
    43.     Exit;
    44.   end;
    45.   Result := 0;
    46.   for i := n downto 1 do
    47.   begin
    48.     b := GetNumByChar(s[i]);
    49.     if b = -1 then
    50.     begin
    51.       Result := -1;
    52.       Exit;
    53.     end;
    54.     Result := Result + Exponentation(16, n - i)*b;
    55.   end;
    56. end;
    57.  
     
  3. razor

    razor Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    40
    в С есть функции аtoi() и atof() (находятся в stdlib.h)

    для целых :
    Код (Text):
    1. int atoi( const char *string );


    для вещественных :
    Код (Text):
    1. double atof( const char *string );
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    razor



    atoi/atof/atol не работают со строками содержащими символы A,B,C,D,E,F. Только цифры (десятичные строки)
     
  5. Smile

    Smile New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2004
    Сообщения:
    129
    А еще в си есть функция strtoul

    из любой системы переводит
     
  6. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Если нужно перевести шестнадцатеричную строку вида '1F3D5B79' в целое число, то можно так:


    Код (Text):
    1.     char h_tbl[]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0,\
    2.                   0,10,11,12,13,14,15, 0, 0, 0, 0, 0, 0, 0, 0, 0,\
    3.                   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\
    4.                   0,10,11,12,13,14,15};
    5.  
    6. //===============================================================
    7. int HexToInt(char* lpString)
    8. {
    9.     int     result=0;
    10.     int     i=0;
    11.     char    ch;
    12.  
    13.     while ( (ch = lpString[i++]-0x30) >= 0 )
    14.         result = (result<<4) + h_tbl[ch];
    15.    
    16.     return result;
    17. }
    18. //===============================================================
    19.  
    20.  
    21.  
    22. int val = HexToInt("1f3d5b79");
    23.  
     
  7. rgo

    rgo New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    87
    пачка функций strto* где вместо '*' может быть 'ul', 'l', 'll', 'ull', 'q', 'uq', 'imax', 'umax', 'd', 'f'. Для целых -- в любой системе счисления читать можно, а флоаты ('d' и 'f'), только в десятичной и шестнадцатеричной, да и то, система определяется форматом записи числа, а не программером :dntknw:
     
  8. SDragon

    SDragon New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2005
    Сообщения:
    133
    Адрес:
    Siberia
    cresta. Для ch >= 0x66 этот код будет вылезать за пределы таблицы h_tbl, возможен Access Violation. Желательно либо заполнить конец таблицы нулями, либо переписать условие цикла:
    Код (Text):
    1. while ( unsigned(ch = lpString[i++]-0x30) < unsigned(0x36) )
    2.         result = (result<<4) + h_tbl[ch];


    Здесь проверяется, что 0x30 <= ch < 0x66, так как при ch < 0x30 вычитание даст отрицательное число. При беззнаковом сравнении это отрицательное число больше, чем 0x8000 0000, значит, заведомо больше 0x36.

    А вообще идея с таблицей очень хорошая. Спасибо, cresta.
     
  9. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    SnugForce


    Код (Text):
    1.  
    2. function GetNumByChar(c: char): Integer;
    3.   begin
    4.     case c of
    5.      '0': Result := 0;
    6.      '1': Result := 1;
    7.      '2': Result := 2;
    8.      '3': Result := 3;
    9.      '4': Result := 4;
    10.      '5': Result := 5;
    11.      '6': Result := 6;
    12.      '7': Result := 7;
    13.      '8': Result := 8;
    14.      '9': Result := 9;
    15.      'A': Result := 10;
    16.      'B': Result := 11;
    17.      'C': Result := 12;
    18.      'D': Result := 13;
    19.      'E': Result := 14;
    20.      'F': Result := 15;
    21.     else
    22.       Result := -1;
    23.     end;
    24.   end;
    25.  




    это что ? анекдот про индийского программиста?
     
  10. ssx

    ssx Member

    Публикаций:
    0
    Регистрация:
    19 авг 2003
    Сообщения:
    336
    ага, похоже :)

    на rsdn почти такое же было
     
  11. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
  12. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    SDragon

    Вообще-то подразумевалась передача валидной zero-terminated строки :)



    P.S.

    Приведенное тобой условие неверное. По нему например "1f3d5b79" возвращает 1 вместо 524114809.

    Надо просто расширить таблицу до 256 байт, установив для невалидных символов -1.
     
  13. SDragon

    SDragon New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2005
    Сообщения:
    133
    Адрес:
    Siberia
    Сорри, ошибочка вышла:
    Код (Text):
    1.  
    2. while(unsigned(ch = lpString[i++]-0x30) <[b]=[/b] unsigned(0x36))
    3.         result = (result<<4) + h_tbl[ch];
    4.