C - 将长整型转换为有符号十六进制字符串

8

大幅编辑:

我有一个长整型变量,需要将其转换为带符号的24位十六进制字符串,字符串开头不能有"0x"。该字符串必须是6个字符,后跟字符串终止符'\0',因此需要添加前导零。

示例: [-1 -> FFFFFF] --- [1 -> 000001] --- [71 -> 000047]

答案 这似乎可以解决问题:

long int number = 37;
char string[7];

snprintf (string, 7, "%lX", number);

只是为了澄清,您所说的有符号十六进制是什么意思,例如-1应该转换成什么? - CB Bailey
FFFFFF(如果我转换正确的话:s) - Cheetah
好的,看起来是将其转换为无符号长整型并打印一个无符号十六进制数。 - CB Bailey
另外还有两个问题...你的字符输出缓冲区是6个字符还是6个字符加上一个终止零?此外,你想要将1转换为'1\0'('1'后跟一个NULL字符)还是' 1'(应该是5个空格然后是'1'),或者是'000001'? - Adisak
1
%lx 转换需要一个 unsigned long,但你传递的是一个 long。虽然它现在能正常工作,但为了形式上的正确性,需要将其转换为 unsigned long。你当前的方法对于大多数负数也会给出错误的值 - 例如尝试 -256 - caf
显示剩余2条评论
4个回答

10
看看 sprintf%lx 格式说明符可以实现你想要的功能。

2
此外,如果可以的话,您应该使用 snprintf 而不是 sprintf - dreamlax

10

由于您只需要六个数字,因此您可能需要进行一些掩码处理,以确保数字符合要求。可以尝试以下代码:

sprintf(buffer, "%06lx", (unsigned long)val & 0xFFFFFFUL);

请注意,您正在将所有长整数映射到一小范围的表示中。在打印之前,您可能需要检查数字是否在特定范围内(例如,-2^23 < x < 2^23 - 1)。


1
这是目前唯一完整的答案(需要转换为“unsigned long”)。 - caf
什么决定了你添加哪个映射?假设我需要一个32位(8个字符的字符串),那么你会添加哪个映射呢?(显然,你也需要将格式标志更改为08) - Cheetah
有效地,映射是x -> x (mod 2^24),因此大于2^24的数字会环绕。对于具有八个字符、32位字符串的情况,它将成为x->x (mod 2^32),无论这是否是一个可逆的注入依赖于在考虑的平台上unsigned long的大小。 - CB Bailey

2

使用itoa函数,它需要一个参数来指定所需的进制。

或者换一种方式,使用符合标准的sprintf函数。


1
在标题中您说您要带符号的十六进制字符串,但是您所有的示例都是无符号的十六进制字符串。假设这些示例是您想要的,最简单的方法是:
sprintf(buffer, "%06X", (int)value & 0xffffff);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接