将unsigned char *转换为char * string C

时间:2017-10-16 04:10:16

标签: c char type-conversion unsigned

我有代码将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的新手,感谢您的回答谢谢。

2 个答案:

答案 0 :(得分:2)

  

actually want将已转换的字符附加到现有的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); 
    
  3.   

    hh指定以下diouxX转换说明符适用于signed char或unsigned char参数(该参数将根据整数提升进行提升,但其值应为   在打印前转换为signed charunsigned 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);
    }
}