我给出了一个数字,例如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不起作用。
我给出了一个数字,例如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
做就是了:
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()
对该指数进行舍入,可以得到位数。