将十进制转换为十六进制时一次仅考虑 4 位

标签 c function binary hex output

我有一个 C 函数将十进制转换为十六进制字符串 hexConversion:

int hexConversion(int num){
    char hex_buffer[9];
    unsigned int mask = 4026531840;
    for(int i = 0; i < 9; i++){
        int temp = mask & num;
        if(temp < 10){
            hex_buffer[i] = temp + '0';
        }
        else if(temp == 10){
            hex_buffer[i] = 'A';
        }
        else if(temp == 11){
            hex_buffer[i] = 'B';
        }
        else if(temp == 12){
            hex_buffer[i] = 'C';
        }
        else if(temp == 13){
            hex_buffer[i] = 'D';
        }
        else if(temp == 14){
            hex_buffer[i] = 'E';
        }
        else if(temp == 15){
            hex_buffer[i] = 'F';
        }
        mask >>= 4;
    }

    hex_buffer[8] = '\0';

    for(int i = 0; i < sizeof(hex_buffer); i++){
        printf("%c", hex_buffer[i]);
    }
}

带有驱动程序代码:

int main(){
    hexConversion(2);
    hexConversion(255);
    hexConversion(-1);
    hexConversion(INT_MAX);
    hexConversion(INT_MIN);
    hexConversion(0xDEADBEEF);
}

我的输出是: 00000002 0000000F 0000000F 0000000F 00000000 0000000F

每个输出的最后一个值都是正确的,但最后一个之前的所有值都没有计算。我相信这是因为我的 temp = mask & num 没有产生非 0-15 的值。我的问题是,如何一次只考虑 4 位,以便我的所有 temp 值都在此范围内?

最佳答案

在不考虑问题的情况下查看代码的第一句话是,为什么您可以很好地管理案例 0..9,但您将案例 A 和 B ... 和 F 分开,而不是像对数字?

所以

int hexConversion(int num){
  char hex_buffer[9];
  unsigned int mask = 4026531840;
  for(int i = 0; i < 9; i++){
    int temp = mask & num;
    if(temp < 10){
      hex_buffer[i] = temp + '0';
    }
    else if (temp < 16) {
      hex_buffer[i] = temp - 10 + 'A';
    }
    else {
      hex_buffer[i] = '?';
    }
    mask >>= 4;
  }

  hex_buffer[8] = '\0';

  for(int i = 0; i < sizeof(hex_buffer); i++){
    printf("%c", hex_buffer[i]);
  }
}

我添加了测试if (temp < 16)如果代码正确,通常是无用的,但结果是:

编译和执行:

pi@raspberrypi:/tmp $ gcc -g -pedantic -Wextra h.c
h.c: In function ‘hexConversion’:
h.c:23:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < sizeof(hex_buffer); i++){
                      ^
pi@raspberrypi:/tmp $ ./a.out
00000002000000?F0??????F???????F000000000??????F

因此,在您的解决方案中,由于代码中的错误,您不会编写某些索引

一种方法是:

void hexConversion(int num){
  char hex_buffer[9];

  for(size_t i = 0; i < sizeof(hex_buffer) -1; i++){
    int temp = (num >> (28-4*i)) & 0xf;
    if(temp < 10){
      hex_buffer[i] = temp + '0';
    }
    else {
      hex_buffer[i] = temp - 10 + 'A';
    }
  }
  hex_buffer[8] = 0;
  puts(hex_buffer);
}

编译和执行:

pi@raspberrypi:/tmp $ gcc -g -pedantic -Wextra h.c
pi@raspberrypi:/tmp $ ./a.out
00000002
000000FF
FFFFFFFF
7FFFFFFF
80000000
DEADBEEF

请注意您的代码假设 int 在 32b 上,与大小无关(但假设 char 在 8 位上):

void hexConversion(int num){
  char hex_buffer[sizeof(int)*2 + 1];

  for(size_t i = 0; i < sizeof(int)*2; i++){
    int temp = (num >> (sizeof(int)*8-4-4*i)) & 0xf;

    if(temp < 10){
      hex_buffer[i] = temp + '0';
    }
    else {
      hex_buffer[i] = temp - 10 + 'A';
    }
  }
  hex_buffer[sizeof(int)*2] = 0;
  puts(hex_buffer);
}

关于将十进制转换为十六进制时一次仅考虑 4 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55009063/

相关文章:

c - 如何在 C 中将无符号定义变量转换为有符号定义变量

c - 存储数十亿整数的数据结构

javascript - 在一定高度上执行 Javascript 函数

Javascript 'this' 作为参数

javascript - 如果表格已经绘制,如何更改值

python - 从一系列数字生成二进制数据数组

file - 如何在matlab中将数据保存在32位二进制文​​件中?

c - 如何通过C编写的cgi-bin程序检索表单 "POST"数据

binary - 为 Stata 中的所有变量重新编码相同的值模式

C - 我在编写 "rotate right"函数时遇到问题