itoa для больших чисел (> dword)

Тема в разделе "WASM.WIN32", создана пользователем Avoidik, 21 янв 2006.

  1. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    значит проблема небольшая, не могу найти оптимального алгоритма для трансформации большого буфера hexadecimal int'ов, в буфер string, получилась вот такая процедура (но естественно на выходе получаем всё перевёрнутым)



    ps. нужно для получения текстовой строки подписи из криптоалгоритмов


    Код (Text):
    1.  
    2. const char hex_table[]="0123456789ABCDEF";
    3.  
    4. void _int2str(byte *in,UINT i_sz,char *out,UINT o_sz)
    5. {
    6.     byte tmp1;
    7.  
    8.     if(i_sz == o_sz/2)
    9.     {
    10.         out[i_sz]='\0';
    11.        
    12.         while(i_sz)
    13.         {
    14.             tmp1=*in++;
    15.  
    16.             out[--i_sz]=hex_table[tmp1 & 0x0F];
    17.             out[--i_sz]=hex_table[(tmp1 >> 4) & 0x0F];
    18.         }
    19.     }
    20. }
    21.  
     
  2. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    никто не может ответить? сам написал, получилось вот что, буду очень рад услышать советы по оптимизации


    Код (Text):
    1.  
    2. void _reverse(char *s)
    3. {
    4.     unsigned char i,j;
    5.     char c;
    6.  
    7.     i = 0;
    8.     j = lstrlen(s) - 1;
    9.  
    10.     while(i < j)
    11.     {
    12.         c = s[i];
    13.         s[i] = s[j];
    14.         s[j] = c;
    15.         i++;
    16.         j--;
    17.     }
    18. }
    19.  
    20. void _int2str(byte *in,UINT i_sz,char *out)
    21. {
    22.     byte    tmp1;
    23.     UINT    x,y,z;
    24.     char    *out_temp;
    25.  
    26.     y=i_sz / 4;
    27.     z=i_sz % 4;
    28.  
    29.     if(y != 0)
    30.     {
    31.         y--;
    32.        
    33.         do
    34.         {
    35.             out_temp=out;
    36.             x=0;
    37.             while(x != 4)
    38.             {
    39.                 tmp1=*in++;
    40.  
    41.                 *out++=hex_table[tmp1 & 0x0F];
    42.                 *out++=hex_table[(tmp1 >> 4) & 0x0F];
    43.                 x++;
    44.             }
    45.             *out='\0';
    46.             _reverse(out_temp);
    47.         }
    48.         while(y--);
    49.     }
    50.     if(z != 0)
    51.     {
    52.         out_temp=out;
    53.         while(z--)
    54.         {
    55.             tmp1=*in++;
    56.  
    57.             *out++=hex_table[tmp1 & 0x0F];
    58.             *out++=hex_table[(tmp1 >> 4) & 0x0F];
    59.         }
    60.         *out='\0';
    61.         _reverse(out_temp);
    62.     }
    63. }
    64.  
     
  3. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    RtlInt64ToUnicodeString для чисел ULONLONG