我已经给出了一个数字,例如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不起作用。
答案 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()
对该指数进行四舍五入,得到位数。