8字节数为C中的十六进制数

时间:2017-12-25 09:27:18

标签: c hex printf

我已经给出了一个数字,例如n = 10,我想用大端以十六进制计算它的长度并将其保存在一个8字节的char指针中。在这个例子中,我想得到以下字符串:
" \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X50&#34 ;.
如何使用例如sprintf在C中自动执行此操作? 我甚至无法得到" \ x50"在char指针中:

char tmp[1];
sprintf(tmp, "\x%x", 50); // version 1
sprintf(tmp, "\\x%x", 50); // version 2

版本1和版本2不起作用。

2 个答案:

答案 0 :(得分:1)

  

我给出了一个数字,例如n = 10,我想以十六进制计算其长度

重复除以16以找到十六进制数字的数量。 do ... while确保n==0时结果为1。

int hex_length = 0;
do {
  hex_length++;
} while (number /= 16);
  

将其保存在8字节char指针中。

C无法强制您的系统使用8字节指针。因此,如果您的系统使用4字节char指针,我们就不走运了。让我们假设OP的系统使用8字节指针。然而整数可以分配给指针。这可能会也可能不会产生有效的指针。

assert(sizeof (char*) == 8);
char *char_pointer = n;
printf("%p\n", (void *) char_pointer);
  

在此示例中,我想获得以下字符串:"\x00\x00\x00\x00\x00\x00\x00\x50"

在C中,字符串包括各种字符,包括空字符"\x00\x00\x00\x00\x00\x00\x00\x50"不是有效的C 字符串,而是有效的字符串文字。代码无法在运行时构造字符串文字,这是源代码的一部分。此外,n==10"\x00...\x00\x50"之间的关系尚不清楚。相反,也许目标是将n存储到一个8字节的数组(大端)中。

char buf[8];
for (int i=8; i>=0; i--) {
  buf[i] = (char) n;
  n /= 256;
}

OP的代码肯定会失败,因为它试图存储一个太小的字符串。进一步"\x%x"不是有效代码,因为\x开始无效的转义序列。

char tmp[1];
sprintf(tmp, "\x%x", 50); // version 1

答案 1 :(得分:0)

只是做:

int i;
...
int length = round(ceil(log(i) / log(16)));

这将为您(在length中)提供表示i所需的十六进制数字数(当然不包含0x)。

log(i) / log(base)i的日志基础。 i的log16为您提供指数。

要明确我们在这里做的事情:当将16增加到找到的指数的幂时,我们回到i:16 ^ log16(i)= i。

通过使用ceil()对该指数进行四舍五入,得到位数。