小端的char * decimal到hexadecimal

时间:2013-08-29 00:26:25

标签: c hex endianness

我有一个问题,我在我的代码中输入一个十进制参数:

./a.out 650

并希望简单地将十进制值转换为十六进制并以小端格式输出:

0A28

我目前的解决方案是使用atoi将char *转换为十进制(我们可以假设输入是十进制的,不用担心错误情况)。

我已经读过我可以创建一个int *并将它转换为char *,类似这样:

char* bar = argv[1];
int* foo = (char*)&bar;

并且迭代它会产生我需要的解决方案,但我不太明白这是如何工作的。

2 个答案:

答案 0 :(得分:2)

像这样:

#include <stdio.h>
#include <stdlib.h>

unsigned long int n = strtoul(argv[1], NULL, 0);
unsigned char const * p = (unsigned char const *)&n;

for (size_t i = 0; i != sizeof n; ++i)
    printf("%02X", p[i]);

要打印反向字节序,请使用sizeof n - i - 1代替i

答案 1 :(得分:2)

这应该是程序的第一个参数,并将其打印为大端十六进制数和小端十六进制。

int main(int argc, char *argv[]) {
  if (argc != 2) return -1;
  char *endptr;
  unsigned long d = strtoul(argv[1], &endptr, 10);
  if (*endptr) {
    printf("Not a decimal number '%s'\n", argv[1]);
    return 1;
  }
  printf("%lX\n", d);  // normal
  do {
   printf("%02hhX", (unsigned char) d);  // little endian first
    d >>= 8;
  } while (d);
  printf("\n");
  return 0;
}