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

问题描述 投票:-1回答:2

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

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

版本1和2不起作用。

c hex printf
2个回答
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

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()对该指数进行舍入,可以得到位数。

© www.soinside.com 2019 - 2024. All rights reserved.