大幅编辑:
我有一个长整型变量,需要将其转换为带符号的24位十六进制字符串,字符串开头不能有"0x"。该字符串必须是6个字符,后跟字符串终止符'\0',因此需要添加前导零。
示例: [-1 -> FFFFFF] --- [1 -> 000001] --- [71 -> 000047]
答案 这似乎可以解决问题:
long int number = 37;
char string[7];
snprintf (string, 7, "%lX", number);
大幅编辑:
我有一个长整型变量,需要将其转换为带符号的24位十六进制字符串,字符串开头不能有"0x"。该字符串必须是6个字符,后跟字符串终止符'\0',因此需要添加前导零。
示例: [-1 -> FFFFFF] --- [1 -> 000001] --- [71 -> 000047]
答案 这似乎可以解决问题:
long int number = 37;
char string[7];
snprintf (string, 7, "%lX", number);
sprintf
。 %lx
格式说明符可以实现你想要的功能。snprintf
而不是 sprintf
。 - dreamlax由于您只需要六个数字,因此您可能需要进行一些掩码处理,以确保数字符合要求。可以尝试以下代码:
sprintf(buffer, "%06lx", (unsigned long)val & 0xFFFFFFUL);
请注意,您正在将所有长整数映射到一小范围的表示中。在打印之前,您可能需要检查数字是否在特定范围内(例如,-2^23 < x < 2^23 - 1)。
使用itoa
函数,它需要一个参数来指定所需的进制。
或者换一种方式,使用符合标准的sprintf
函数。
sprintf(buffer, "%06X", (int)value & 0xffffff);
%lx
转换需要一个unsigned long
,但你传递的是一个long
。虽然它现在能正常工作,但为了形式上的正确性,需要将其转换为unsigned long
。你当前的方法对于大多数负数也会给出错误的值 - 例如尝试-256
。 - caf