【问题标题】:How do I convert an unsigned char array into a string in C?如何将 unsigned char 数组转换为 C 中的字符串?
【发布时间】:2014-03-07 20:21:45
【问题描述】:

如果我有这样的数组

unsigned char data[2850] = "";

在运行我的程序的一部分后,最终会充满字节元素,因此如果我循环并注销它,我将看到以下内容

    for (size_t i= 0; i < sizeof(data); i++) {
        printf("%02X ", data[i]);
    }

    //log window shows 01 24 81 00 0E 1C 44 etc...

有没有办法获取数据数组的所有元素并将它们放入一个 const char 中?还是只有一根大绳子?希望我说得足够清楚。我的目标是最终将这个数据数组的所有元素转换成一个 base64 编码的字符串,我可以在程序的其他地方使用它。

【问题讨论】:

  • 什么意思?您是否暗示该数组不是以空值终止的并且您希望它是?除了它似乎包含空值。请更准确地说出您想要的内容。
  • 您想要十六进制值的字符串表示?请具体。
  • 是那些十六进制值,00 真的是0x00?如果是这样,则不能将其用作字符串,因为 C 使用十六进制 0 作为字符串终止符。
  • 您的目标是打印它们还是操纵它们?如果您只想打印它们,则无需先将其转换为字符串。
  • 如果数组包含更多的 B,您将更有可能被刺痛

标签: c arrays string


【解决方案1】:

C 中的字符串(char 数组)是 chars 的顺序序列,由一个前哨字符(空终止符:'\0')终止

这意味着,如果您在数组中的任何位置都有一个值为 0x00 的字节,那么它可能会在序列结束之前终止“字符串”。在您的示例中,如果您将 data 数组转换为字符串,则它的末尾将是第一个元素:

data[]{00, EB, 23, EC, FF, etc... };

现在如果你想把这里的数据值变成一个字符串,你可以用sprintf()来做,例如:

unsigned char val = 00;
data[0] = val;
char dump[5] = {0};

sprintf(dump, "%02x", data[0]);

现在你有了一个值为“00”的字符串,你可以用类似这样的东西使它更有趣:

sprintf(dump, "0x%02x", data[0]);

所以它有“0x00”来显示它作为十六进制数据。

你可以循环这样的东西来给出完整的字符串......但请记住,可打印的字符串需要至少是数据字符串大小的 2x+1(ASCII 为 2x,null 为 +1),并且您必须逐步填写新字符串。示例:

unsigned char data[5] = {0x00, 0x12, 0xB3, 0xFF, 0xF0};
char printstr[11] = {00};

for(int x = 0; x < 5; x++)
    sprintf(printstr+(x*2), "%02x", data[x]);
printstr[10] = '\0';

现在printstr 拥有"0012b3fff0"

【讨论】:

  • 感谢您如此透彻,真的很有意义。
【解决方案2】:

您可以使用 sprintf(请注意,如果您 sprintf 超过了 'str' 数组的末尾,则会出现缓冲区溢出):

//malloc 2 chars for each byte of data (for 2 hex digits)
char *str = malloc(sizeof(char) * 3 * (sizeof(data) + 1));

//this var will point to the current location in the output string
char *strp = str;

if (NULL == str)
{
    return false; //memory error
}

for (size_t i= 0; i < sizeof(data); i++) {
    snprintf(strp, 2, "%02X ", data[i]);
    strp++;
}

// now the memory in *str holds your hex string!

【讨论】:

  • 差不多。再添加一个空格用于终止'\0'...char *str = malloc(sizeof(char) * (2 * sizeof(data) + 1));
【解决方案3】:

这很容易 变量 test 是数据类型 char 或 unsigned char

std::string User_re((char*)test); 

【讨论】:

    【解决方案4】:

    转换一个无符号字符数组 -

    unsigned char buf[BUFSIZE];
    

    转换成 C 字符串

     #include <string>
    
     std :: string bufstring;
    

    执行以下操作 -

    string bufstring = reinterpret_cast<const char*>(buf);
    

    【讨论】:

      猜你喜欢
      • 2018-03-27
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      相关资源
      最近更新 更多