【问题标题】:How can I convert an integer to a hexadecimal string in C?如何在 C 中将整数转换为十六进制字符串?
【发布时间】:2010-08-12 01:48:54
【问题描述】:

如何在 C 中将整数转换为十六进制字符串?

示例:整数 50 将转换为十六进制字符串 "32""0x32"

【问题讨论】:

    标签: c


    【解决方案1】:

    这段代码

    int a = 5;
    printf("%x\n", a);
    

    打印

    5
    

    这段代码

    int a = 5; 
    printf("0x%x\n", a);
    

    打印

    0x5
    

    这段代码

    int a = 89778116;
    printf("%x\n", a);
    

    打印

    559e7c4
    

    如果您将格式中的 x 大写,则它会大写十六进制值:

    int a = 89778116;
    printf("%X\n", a);
    

    打印

    559E7C4
    

    如果要打印指针,请使用 p 格式说明符:

    char* str = "foo";
    printf("0x%p\n", str);
    

    打印

    0x01275744
    

    【讨论】:

    • 我建议使用# 修饰符而不是编写自己的0x,尤其是%p,其行为由实现定义并且可能已经包含0x。跨度>
    • 可能还想提一下snprintf
    • 此外,您的答案格式与交替块混淆。在语句之后只有一个代码块,其结果为 cmets 可能很有用。
    • @R.. 请注意,对于 #,当值为 0 时,"0x" 不会预先添加。printf("%#X\n", 0); --> 0。 IMO,printf("0x%X\n", a); 是值得的,保持 x 为小写,A-F 为大写。 0x559E7C4
    【解决方案2】:

    以下代码采用 integer 并以十六进制格式从中生成 string

    int  num = 32424;
    char hex[5];
    
    sprintf(hex, "%x", num);
    puts(hex);
    

    给予

    7ea8
    

    【讨论】:

      【解决方案3】:

      通常使用printf(或其表亲之一)使用%x 格式说明符。

      【讨论】:

      • 您可能希望至少提供strtol 的签名或手册页链接。
      • strtol() 与他要求的相反。这是错误的方向。
      • 您可以使用%X 进行大写输出。
      【解决方案4】:

      有趣的是,这些答案使用printf,就像它是给定的一样。 printf 将整数转换为十六进制字符串值。

      //*************************************************************
      // void prntnum(unsigned long n, int base, char sign, char *outbuf)
      // unsigned long num = number to be printed
      // int base        = number base for conversion;  decimal=10,hex=16
      // char sign       = signed or unsigned output
      // char *outbuf   = buffer to hold the output number
      //*************************************************************
      
      void prntnum(unsigned long n, int base, char sign, char *outbuf)
      {
      
          int i = 12;
          int j = 0;
      
          do{
              outbuf[i] = "0123456789ABCDEF"[num % base];
              i--;
              n = num/base;
          }while( num > 0);
      
          if(sign != ' '){
              outbuf[0] = sign;
              ++j;
          }
      
          while( ++i < 13){
             outbuf[j++] = outbuf[i];
          }
      
          outbuf[j] = 0;
      
      }
      

      【讨论】:

      • 缺少num 变量
      • 您不检查基数 > 16。它至少应该在标题中。另外,我认为您可以将标志留给来电者
      • 您必须将变量 num 替换为 n 才能使此脚本正常工作。
      【解决方案5】:

      我做了一个库来进行十六进制/十进制转换,而不使用stdio.h。使用非常简单:

      char* dechex (int dec);
      

      这将使用calloc()来返回一个指向十六进制字符串的指针,这样使用的内存量得到了优化,所以不要忘记使用free()

      这里是github上的链接:https://github.com/kevmuret/libhex/

      【讨论】:

        【解决方案6】:

        将整数转换为字符串还涉及char数组或内存管理。

        为了处理这种短数组的那部分,代码可以使用 复合文字,从 C99 开始,创建数组空间,on the fly字符串在块结束前有效。

        #define UNS_HEX_STR_SIZE ((sizeof (unsigned)*CHAR_BIT + 3)/4 + 1)
        //                         compound literal v--------------------------v
        #define U2HS(x) unsigned_to_hex_string((x), (char[UNS_HEX_STR_SIZE]) {0}, UNS_HEX_STR_SIZE)
        
        char *unsigned_to_hex_string(unsigned x, char *dest, size_t size) {
          snprintf(dest, size, "%X", x);
          return dest;
        }
        
        int main(void) {
          // 3 array are formed v               v        v
          printf("%s %s %s\n", U2HS(UINT_MAX), U2HS(0), U2HS(0x12345678));
          char *hs = U2HS(rand());
          puts(hs);
          // `hs` is valid until the end of the block
        }
        

        输出

        FFFFFFFF 0 12345678
        5851F42D
        

        【讨论】:

          【解决方案7】:

          此答案适用于那些需要以十进制表示形式从string 开始(而不是从int)开始的人。

          1. 将数字的字符串表示形式转换为整数值(可以使用int atoi( const char * str ); 函数
          2. 获得整数后,您可以将其打印为十六进制,例如,使用 sprintf 函数,将 %x 作为格式参数,将整数作为值参数

          这是一个工作示例:https://ideone.com/qIoHNW

          #include <stdio.h>
           
          int main(void) { 
              int n;
              char hex_val[50];
           
              n = atoi("100663296");
              sprintf(hex_val, "%x", n);
           
              printf("%s", hex_val);
              return 0;
          }
          

          【讨论】:

            猜你喜欢
            • 2017-08-12
            • 1970-01-01
            • 2015-04-30
            • 2015-11-29
            • 2018-01-31
            • 2012-10-02
            • 2014-12-15
            相关资源
            最近更新 更多