如果我有一个像这样的数组
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编码的字符串,我可以在程序中的其他位置使用。
答案 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);