是否可以将无符号字符数组表示为字符串?
当我搜索它时,我发现只有memset()能够做到这一点(但是逐个字符)。 假设这不是正确的方法,有没有办法进行转换?
上下文:我正在尝试存储加密哈希函数的输出,该函数恰好是无符号字符数组。
例如:
unsigned char data[N]; ...
for(i=0;i<N;i++) printf("%x",data[i]);
我的目标是将数据表示为字符串(%s),而不是每个元素访问它。因为我需要将哈希的输出作为字符串进行进一步处理。
谢谢!
答案 0 :(得分:18)
那么,根据你的更新,你是在谈论尝试将无符号字符串缓冲区转换为十六进制解释,如下所示:
#define bufferSize 10
int main() {
unsigned char buffer[bufferSize]={1,2,3,4,5,6,7,8,9,10};
char converted[bufferSize*2 + 1];
int i;
for(i=0;i<bufferSize;i++) {
sprintf(&converted[i*2], "%02X", buffer[i]);
/* equivalent using snprintf, notice len field keeps reducing
with each pass, to prevent overruns
snprintf(&converted[i*2], sizeof(converted)-(i*2),"%02X", buffer[i]);
*/
}
printf("%s\n", converted);
return 0;
}
哪个输出:
0102030405060708090A
答案 1 :(得分:2)
在C中,字符串是char
的数组,以值为0的字符结束。
语言未指定char
是否为有符号或无符号类型,您必须明确并使用unsigned char
或signed char
(如果您真的在乎)。
通过将无符号字符数组“表示”为字符串,您的意思并不清楚。如果你想做一些像这样的事情,那么抛弃标志很容易:
const unsigned char abc[] = { 65, 66,67, 0 }; // ASCII values for 'A', 'B', 'C'.
printf("The English alphabet starts out with '%s'\n", (const char *) abc);
这将有效,printf()
没有太大区别,它会看到一个指向字符数组的指针并将它们解释为字符串。
当然,如果您使用的是不使用ASCII的系统,那么在执行此操作的情况下可能会出现问题。同样,你的问题不是很清楚。
答案 2 :(得分:2)
C中的字符串就是一个接一个的字符串。如果它们未签名或签名没有太大问题,您可以轻松地投射它们。
因此,要从unsigned char数组中获取字符串,您所要做的就是确保最后一个字节是终止字节'\ 0'然后将此数组转换为char *(或将其复制到数组中char)
答案 3 :(得分:1)
我成功使用它将unsigned char数组转换为std:string
unsigned char array[128];
std::stringstream buffer;
for (int i = 0; i < 128; i++)
{
buffer << std::hex << std::setfill('0');
buffer << std::setw(2) << static_cast<unsigned>(array[i]);
}
std::string hexString = buffer.str();
答案 4 :(得分:-1)
您问过的一个例子:
unsigned char arr [SIZE];