将十进制数组转换为十六进制

时间:2021-07-06 12:28:15

标签: c

我正在尝试运行示例代码以将十进制数数组转换为六进制数并将它们存储在另一个数组中。如果我扫描数字,代码就可以工作,但是在使用数组时,我遇到了分段错误。

#include <stdio.h> 

int main(void)
{   
    int  bin = 0;
   // int num ;
    int i = 0, rem;
    char hex_arr[60];

    //printf("Enter a decimal number: "); 
    //scanf("%d", &num); 
    int num [60] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 128, 31, 239, 31, 254, 1, 255, 240, 0, 0, 0, 0, 127, 255, 192, 255, 255, 255, 128, 127, 231, 192, 120, 14, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

    for (int k = 0; k <= 59; i++)
    {
        rem = num[k] % 16;  // get the right most digit

        if (rem < 10)
        {
            hex_arr[i++] = 48 + rem;
        }
        else
        {
            hex_arr[i++] = 55 + rem;
        }

        num[k] /= 16;  // get the quotient
    }
    printf("0x");

    for(int j = i - 1; j >= 0 ; j--)  // print the hex_arr in reverse order
    {
        printf("%c", hex_arr[j]);
    }    

    return 0; 
}

2 个答案:

答案 0 :(得分:1)

你需要摆脱所有的“幻数”。

  • k <= 59-> k < 60
  • 48 + rem -> '0' + rem
  • 55 + rem -> '7' + rem

等等,'7' 有什么意义?事实证明它没有,并且使用“魔术数字”隐藏了该错误。您可能指的是 65,应该写为 'A'

(严格来说,使用符号值的算术在 C 中没有明确定义,因为实际上只有符号 '0''9' 被保证是一个连续的序列。在实践中“它会工作" 在所有主流系统上。)

如评论中所述,for (int k=0; ...; i++) 可能也没有任何意义。

答案 1 :(得分:1)

这有帮助吗

注意事项

  1. num 现在被定义为一个无符号字符数组 - 如果这是一个问题,你可以在 ByteToASCII 中进行转换
  2. 它一次性转换整个字符串,但很容易转换为一次处理一个字节
  3. 不清楚您是希望 num 数组作为 nybbles 列表还是整个字节,但同样,在此代码中很容易更改
#include<stdio.h>
#include<string.h>
#include<ctype.h>

#include <stdio.h> 

void ByteToASCII (char * string, unsigned char   byte )
      {
         char    curval      ;

         curval = (char) ('0'  | (byte >> 4)) ;

         if ('9' < curval)
         {
            curval += (char) ('A' - '9' - 1) ;
         }

         *string++ = curval ;

         byte <<= 4 ;

         curval = (char) ('0'  | (byte >> 4)) ;

         if ('9' < curval)
         {
            curval += (char) ('A' - '9' - 1) ;
         }

         *string++ = curval ;
         *string = 0 ; // keep null terminated
      }

int main(void)
{   
    //printf("Enter a decimal number: "); 
    //scanf("%d", &num); 
    
    unsigned char num [60] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 128, 31, 239, 31, 254, 1, 255, 240, 0, 0, 0, 0, 127, 255, 192, 255, 255, 255, 128, 127, 231, 192, 120, 14, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    char hex_arr[(2 * sizeof(num)) + 1];

    for (int k = 0; k < sizeof(num); k++)
    {
        ByteToASCII (&hex_arr[k * 2], num[k]) ;
    }
    printf(hex_arr);
    return 0; 
}
相关问题