【问题标题】:8 Byte Number as Hex in C8字节数作为C中的十六进制
【发布时间】:2018-06-06 15:12:34
【问题描述】:

我给了一个数字,例如 n = 10,我想用大端序计算它的十六进制长度,并将它保存在一个 8 字节的字符指针中。在此示例中,我想获取以下字符串:
“\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 不起作用。

【问题讨论】:

  • 十六进制的十进制 50 是 0x32,所以我不知道你为什么期望它是 0x50...
  • char tmp[1]; => 对于任何 1 大小的 nul 终止字符串来说都太短了
  • 我想用十六进制计算十进制 n=10,即 0x50,我想用 sprintf 将它保存在一个字符指针中,这样字符串就是“\x50”。字符 tmp[2]; sprintf(tmp, "\\x%x", 50); tmp[1] = 0;也不行。
  • 十进制 10 不是十六进制 50:它是十六进制 0A。 50 是十六进制 32。
  • char tmp[2] 仍然太短。它只能存储1个字符的字符串

标签: c hex printf


【解决方案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() 对该指数进行四舍五入,您可以得到位数。

【讨论】:

  • 谢谢,但我不想计算我需要代表 n 的长度。我想通过使用 8 部分的 ghr 形式“\x..”,例如“\x00”或“\x50”,将 n 表示为大端的 64 位数字。
  • @Cyber​​gy 但你字面上写的是:“我想用十六进制计算它的长度”?
  • 是的,你是对的。我写错了。我很抱歉。这次我试图更好地解释它。我给了一个字符串,比如说 char *string = "message123"。然后我计算字符串的长度:n = strlen(string)。所以 n = 10。那是 0x0a 字节或 0x50 位。我想将其表示为“\x00\x00\x00\x00\x00\x00\x00\x50”(64 位大端)。我想要做的是:我的输入是一个类似“message123”的字符串,输出应该是“\x00\x00\x00\x00\x00\x00\x00\x50”。
  • 为什么你认为十六进制 50 代表十进制 10?
  • ceil(log(i) / log(16)) 在对数或除法计算稍有不精确的情况下会冒着被一比一的风险。
【解决方案2】:

我给了一个数字,例如n = 10,我想用十六进制计算它的长度

反复除以 16 以找到十六进制数字的个数。当n==0 时,do ... while 确保结果为 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 中,string 包括各种字符,直到包括 null 字符"\x00\x00\x00\x00\x00\x00\x00\x50" 不是一个有效的 C string,但却是一个有效的 string literal。代码不能在运行时构造字符串文字,这是源代码的一部分。此外,n==10"\x00...\x00\x50" 之间的关系尚不清楚。相反,目标可能是将n 存储到一个 8 字节数组(大端)中。

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

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

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

【讨论】:

    猜你喜欢
    • 2017-06-17
    • 2015-08-08
    • 2017-09-13
    • 2019-02-21
    • 2012-01-24
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多