如何在C语言中将无符号字符数组转换为字符串?

3

如果我有这样的一个数组

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...

有没有办法将data数组的所有元素放入const char中?还是只有一个大字符串?希望我表述得足够清楚。我的目标是最终将此数据数组的所有元素转换为Base64编码字符串,以便在程序中其他地方使用。


1
你的意思是什么?你是在暗示数组没有以 null 结尾,而你希望它以 null 结尾吗?但是它似乎包含了 null。请更准确地说明你想要什么。 - ikegami
4
那些是十六进制的值,00 真正代表的是 0x00 吗?如果是,就不能将其作为字符串使用,因为 C 使用十六进制的 0 作为字符串终止符。 - Marc B
2
如果数组中包含更多的B,那么你更有可能得到一个“刺”。 - pat
@pat - 那真是太有趣了,哈哈 :-) - trumpetlicks
我猜他想用base16进行编码,例如“012481000E1C44”。如果是这样的话,你不需要进行此步骤来转换为base64,可以直接从数组中进行。 - m0skit0
显示剩余5条评论
4个回答

3

C中的字符串(char数组)是由一系列char字符组成的顺序序列,以一个特殊字符(空终止符:'\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 倍大小(2x 是 ASCII 码所需空间,+1 为 null),并且必须分步填充新字符串。示例:

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"

非常感谢您的细致入微,这确实让很多事情变得清晰明了。谢谢! - Stavros_S

1
你可以使用sprintf(请注意,如果你在'str'数组的结尾处超出了sprintf,你将会发生缓冲区溢出):
//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)); - Floris

-1

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

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

-1

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

unsigned char buf[BUFSIZE];

将文本转换为C字符串
 #include <string>

 std :: string bufstring;

做以下事情 -
string bufstring = reinterpret_cast<const char*>(buf);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接