【问题标题】:Converting unsigned char * to char * string C将 unsigned char * 转换为 char * 字符串 C
【发布时间】:2018-03-27 12:47:00
【问题描述】:

我有将 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 的新手,感谢任何答案。

【问题讨论】:

  • 如果0 &lt;= i &lt;= 15,看起来你想要unsigned char byte = (unsigned char)i; 和char string[2] = {(char)byte, '\0'};?这听起来对吗,还是这里涉及的字节不止一个? (你真的需要printf,还是putchar 可以正常工作?)
  • char byte[2]; sprintf(byte, "%X", (unsigned char)i); printf("%s", byte);
  • 是的,没错,我实际上只需要一个字节而不是字节数组,所以unsigned char 就足够了。我知道“%X”是打印无符号字符的方式,但我实际上想将转换后的char 附加到现有的char * 上,而不仅仅是打印它。 (打印语句实际上只是用于调试)
  • 当i 是单个无符号字符时,char character = (char) i 似乎不起作用
  • @Miradham Kamilov That 不是附加,而是连接。 sprintf()不擅长追加。

标签: c char type-conversion unsigned


【解决方案1】:
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 类型,对于更大或更小的类型,您需要另一个说明符。我强烈建议像这样使用&lt;stdint.h&gt; 和&lt;inttypes.h&gt;:

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

【讨论】:

    【解决方案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); 
      

    hh 指定以下 d、i、o、u、x 或 X 转换说明符适用于有符号字符或无符号字符参数(该参数将具有根据整数提升进行提升,但其值应为 打印前转换为signed char或unsigned char); ... C11 §7.21.6.1 7

    【讨论】:

      猜你喜欢
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 2013-09-23
      • 2013-05-13
      • 1970-01-01
      • 2020-05-03
      相关资源
      最近更新 更多