我有代码将int转换为unsigned char *,如下所示:
int i = //a number <= 15;
unsigned char * byte = (unsigned char *) &i;
我这样做是因为我需要该int的字节值。
稍后我想将此字节值附加到char *
,因此我需要将其转换为字符串。
Ex. if: int i = 15;
then: unsigned char * byte = F;
但是我需要将其转换为:
char * string = "F";
我试过了:
char * string = (char *) &byte;
//and
char * string = (char *) byte;
//or just straight up treating it like a char * by going:
printf("%s", byte);
和其他几种组合,但它们都导致了seg故障。有谁知道我怎么做到这一点?或者即使有更简单的方法将int转换为char中的十六进制表示形式?
我是C的新手,感谢您的回答谢谢。
答案 0 :(得分:2)
我actually want将已转换的字符附加到现有的
char *
确保目的地足够大。
char existing[100];
// existing is populated somehow, now to add the `unsigned char`
size_t len = strlen(existing);
// 2 is the max size of a 8-bit value printed in hex. Adjust as needed.
if (len + 2 >= sizeof existing) Error_BufferTooSmall();
写到现有char *
的末尾。
// Only use the least significant `char` portion with `hh`
sprintf(existing + len , "%hhX", (unsigned) i);
hh
指定以下d
,i
,o
,u
,x
或X
转换说明符适用于signed char或unsigned char参数(该参数将根据整数提升进行提升,但其值应为 在打印前转换为signed char
或unsigned char
; ......C11§7.21.6.17
答案 1 :(得分:0)
int i = //a number <= 15;
unsigned char * byte = (unsigned char *) &i;
是完全错误的。
您正在做的是获取整数变量i
的地址并放入指向unsigned char
的指针。
根据我的阅读,我认为您想要将整数转换为字符(或字符串)。
您可以使用itoa
执行此操作,也可以使用sprintf
执行此操作。
例如:
#include <stdio.h> // printf, snprintf
int main(void) {
int i = 255;
char theIntegerAsString[5] = {0};
if (snprintf(theIntegerAsString, sizeof(theIntegerAsString), "%X", i) > 0) {
printf("The number %d in Hexadecimal is: %s\n", i, theIntegerAsString);
}
}
您可能想知道为什么我使用snprintf
代替sprintf
。
这是因为sprintf
并不总是检查缓冲区大小,而snprintf
总是这样做。请参阅buffer overflow。
请注意%X
特定于unsigned int
类型,适用于您需要其他说明符的较大或较小类型。我强烈建议您使用<stdint.h>
和<inttypes.h>
:
#include <stdio.h> // printf, snprintf
#include <stdint.h> // intX_t
#include <inttypes.h> // PRIx..
int main(void) {
int32_t i = 255; // signed 32 bit integer
char theIntegerAsString[5] = {0};
if (snprintf(theIntegerAsString, sizeof(theIntegerAsString), "%" PRIX32, i) > 0) {
printf("The number %" PRId32 " in Hexadecimal is: %s\n", i, theIntegerAsString);
}
}