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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8字节数为C中的十六进制数相关的知识,希望对你有一定的参考价值。

我给出了一个数字,例如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
", (void *) char_pointer);

在这个例子中,我想得到以下字符串:"x00x00x00x00x00x00x00x50"

在C中,字符串包括各种字符,包括空字符。 "x00x00x00x00x00x00x00x50"不是有效的C字符串,但却是有效的字符串文字。代码无法在运行时构造字符串文字,这是源代码的一部分。此外,n==10"x00...x00x50"之间的关系尚不清楚。相反,也许目标是将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()对该指数进行舍入,可以得到位数。

以上是关于8字节数为C中的十六进制数的主要内容,如果未能解决你的问题,请参考以下文章

一个字节等于多少二进制数?

C中的float和double的有效数字和精度各是多少?

C语言基本整型的数据范围啥意思

位图存储图像数据每行字节数为4的倍数

ascii编码占用的字节长度是

mysql五种日期类型的取值范围