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

时间:2014-03-07 20:21:45

标签: c arrays string

如果我有一个像这样的数组

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编码的字符串,我可以在程序中的其他位置使用。

4 个答案:

答案 0 :(得分:3)

C中的字符串(字符数组)是char s的序列序列,以sentianal字符终止(空终止符:'\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"

答案 1 :(得分:1)

你可以使用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!

答案 2 :(得分:0)

这很容易 变量测试是数据类型char或无符号char

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

答案 3 :(得分:0)

要转换无符号字符数组-

unsigned char buf[BUFSIZE];

放入C字符串

 #include <string>

 std :: string bufstring;

执行以下操作-

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