首页 > 解决方案 > 将十进制数组转换为十六进制

问题描述

我正在尝试运行示例代码将十进制数数组转换为十六进制数并将它们存储在另一个数组中。如果我扫描数字,则代码有效,但在使用数组时出现分段错误。

#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; 
}

标签: c

解决方案


这有帮助吗

笔记

  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; 
}

推荐阅读