Advertisement
Mateus_Costa

Conversor de bases numéricas em C

May 14th, 2019
285
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.29 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <string.h>
  5. #include <math.h>
  6.  
  7. /************************************************************************************
  8. * @brief Converte uma sequência númerica para uma outra sequência númerica com outra base.
  9. *************************************************************************************
  10. * @param source A fonte que será convertida
  11. * @param baseSource A base que a fonte está (binário = 2, octal = 8, decimal = 10, hex = 16, etc)
  12. * @param dest O vetor de destino que irá conter o valor convertido
  13. * @param base A base para o qual o destino será retornado
  14. *************************************************************************************/
  15. void convert(const char *source, int baseSource, char *dest, int base)
  16. {
  17.     int sourceBase10 = 0;
  18.  
  19.     if(baseSource != 10) {
  20.         int i;
  21.         int expoent = 0;
  22.         for(i = strlen(source) - 1; i > -1; i--) {
  23.             int digit = (source[i] > '9') ? (toupper(source[i]) - 55) : (source[i] - 48);
  24.             int tmp = digit * pow(baseSource, expoent);
  25.             sourceBase10 = sourceBase10 + tmp;
  26.             expoent = expoent + 1;
  27.         }
  28.     }
  29.     else {
  30.         sourceBase10 = atoi(source);
  31.     }
  32.  
  33.     int dividendo = sourceBase10;
  34.     int pos = 0;
  35.     while(dividendo >= base) {
  36.         int r = dividendo % base;
  37.         dest[pos] = r >= 10 ? (r + 55) : (r + 48);
  38.         pos++;
  39.         dividendo = dividendo / base;
  40.     }
  41.     dest[pos] = dividendo >= 10 ? (dividendo + 55) : (dividendo + 48);
  42.     dest[pos + 1] = '\0';
  43.  
  44.     size_t size = strlen(dest);
  45.     int i;
  46.     for(i = 0; i < size / 2; i++) {
  47.        char tmp = dest[i];
  48.        dest[i] = dest[size - i - 1];
  49.        dest[size - i - 1] = tmp;
  50.     }
  51. }
  52.  
  53. /* Exemplos de uso */
  54.  
  55. int main(void)
  56. {
  57.     char buffer[16]; /* buffer com precisão de 15 dígitos, ou seja: int32 */
  58.  
  59.     /* converte 745(base 10) para hex (base 16) */
  60.     convert("745", 10, buffer, 16);
  61.     printf("%s(base 16)\n", buffer);
  62.  
  63.     /* converte 745(base 10) para binário (base 2) */
  64.     convert("745", 10, buffer, 2);
  65.     printf("%s(base 2)\n", buffer);
  66.  
  67.     /* converte 1011101001(base 2) para decimal (base 10) */
  68.     convert("1011101001", 2, buffer, 10);
  69.     printf("%s(base 10)\n", buffer);
  70.     return 0;
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement