2011-04-14 42 views
5

可以将无符号字符数组表示为字符串吗?如何将无符号字符数组转换为C中的十六进制字符串

当我搜索它,我发现只有memset()能够做到这一点(但字符)。 假设这不是正确的方法,有没有办法进行转换?

上下文:我试图存储密码散列函数的输出,这恰好是一个无符号字符数组。
例如:

unsigned char data[N]; ... 
for(i=0;i<N;i++) printf("%x",data[i]); 

我的目标是把数据表示为一个字符串(%S),而不是由每个元素访问它。因为我需要散列的输出作为字符串进一步处理。

谢谢!

+0

它是什么试图实现?从表面上将数组转换为(char *)可以实现你所要求的 – forsvarir 2011-04-14 09:31:29

+0

不是一个无符号的字符数组吗?我的意思是我没有意识到任何负面的ASCII值...... – 2011-04-14 09:32:43

+0

另外,memset将缓冲区设置为提供的值,给定的次数,所以我无法真正了解这对您会有多大帮助...代码/伪代码示例可能有所帮助。 – forsvarir 2011-04-14 09:35:05

回答

14

因此,根据您的更新,你在说什么想一个无符号字符缓冲区转换为十六进制的解释,这样的事情:

#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 
+0

sprintf是一个很棒的功能! :) – Maverickgugu 2011-04-14 13:56:03

+1

@Maverickgugu:这是...但它也是危险的:)注意缓冲区溢出,因为它没有做任何长度检查。有一个更安全的版本(snprintf),它允许您指定可以写入缓冲区的最大大小,您可能需要查看一下。 – forsvarir 2011-04-14 13:59:15

+0

@forsvarir:在同样的意义上..我们可以表示字符串的二进制表示中的无符号字符数组吗?建议将有帮助.. – Maverickgugu 2011-04-16 14:00:15

2

在C中,一个字符串是char阵列,是有符号或无符号的类型不被指定的语言,其值是0。

无论char字符终止,你必须明确的如果你真的在意,可以使用unsigned charsigned 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的系统,那么在执行此操作时可能会出现蠕变。再一次,你的问题不是很清楚。

+0

我正在使用MAC,如果其中一个无符号字符具有超级dooper值而不是常规ASCII值,那么类型转换是否仍会给出垃圾值? – Maverickgugu 2011-04-14 10:02:06

2

那么C中的字符串就是一个接一个的字符。如果他们没有签名或签名不是什么大问题,你可以轻松地施放它们。

所以要从unsigned char数组中取出一个字符串,你所要做的就是确保最后一个字节是一个终止字节'\ 0',然后将这个数组转换成char *(或者将它复制到炭的阵列)

+0

谢谢。解决方案看起来很简单但是,我用字符串连接一个无符号字符数组吗?我应该插入一个空字符作为最后一个元素吗? – Maverickgugu 2011-04-14 09:59:04

+1

那么,在密码上下文中,这可能不是那么容易,这一切都取决于你将如何处理字符串。你必须记住哈希函数的输出可能已经包含'\ 0'字节,并且你可能最终只是在字符串的一部分上工作,因为如果看到这样一个字节,字符串处理函数将停止工作 – Chris 2011-04-14 10:02:37

+0

是的。我完全同意你的推理! – Maverickgugu 2011-04-14 10:06:07

-1

为您要求一个例子:

无符号字符ARR [SIZE];

+0

这只是宣言。我想知道是否可以将此数组打印为“%s”? – Maverickgugu 2011-04-14 10:04:19

2

我成功使用它将无符号字符数组转换为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(); 
相关问题