将 unsigned char * 转换为 char * string C

Converting unsigned char * to char * string C

我有将 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);

和其他几种组合,但它们都导致了段错误。有谁知道我该怎么做?或者即使有更简单的方法将 int 转换为 char 中的十六进制表示形式?

我是 C 的新手,非常感谢您的回答。

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);
    }
}

I to append the converted char to an existing char *

  1. 确保目的地足够大。

    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();
    
  2. 写到现有char *的末尾。

    // Only use the least significant `char` portion with `hh`
    sprintf(existing + len , "%hhX", (unsigned) i); 
    

hh Specifies that a following d, i, o, u, x, or X conversion specifier applies to a signed char or unsigned char argument (the argument will have been promoted according to the integer promotions, but its value shall be converted to signed char or unsigned char before printing); ... C11 §7.21.6.1 7