如何在C中将无符号字符数组转换为十六进制字符串
Posted
技术标签:
【中文标题】如何在C中将无符号字符数组转换为十六进制字符串【英文标题】:How to convert an Unsigned Character array into a hexadecimal string in C 【发布时间】:2011-08-05 09:20:23 【问题描述】:是否可以将无符号字符数组表示为字符串?
当我搜索它时,我发现只有 memset() 能够做到这一点(但逐个字符)。 假设这不是正确的方法,有没有办法进行转换?
上下文:我正在尝试存储加密哈希函数的输出,该函数恰好是一个无符号字符数组。 例如:
unsigned char data[N]; ...
for(i=0;i<N;i++) printf("%x",data[i]);
我的目标是将数据表示为字符串 (%s),而不是按每个元素访问它。因为我需要将哈希的输出作为字符串进行进一步处理。
谢谢!
【问题讨论】:
您真正想要实现的目标是什么?表面地将数组转换为 (char*) 可以实现您的要求 无符号字符数组不是字符串吗?我的意思是我不知道任何负 ASCII 值... 顺便说一句,memset 将缓冲区设置为提供的值,给定次数,所以我真的看不出这对你有多大帮助......代码/伪代码示例可能会有所帮助。 我已经用上下文编辑了这个问题。如果我还不清楚,请随时指出。 【参考方案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();
【讨论】:
【参考方案2】:所以,根据您的更新,您是否在谈论尝试将 unsigned char 缓冲区转换为十六进制解释,如下所示:
#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
【讨论】:
@Maverickgugu:它是......但它也很危险 :) 注意缓冲区溢出,因为它不做任何长度检查。有一个更安全的版本 (snprintf),它允许您指定可以写入您可能想要查看的缓冲区的最大大小。 @forsvarir: 在同样的意义上.. 我们可以用字符串的二进制表示来表示无符号字符数组吗?建议会很有帮助.. @Maverickgugu:所以不要将其转换为字符串:0A0B 等,您想要 000010、000011 等? @forsvarir:是的.. 完全正确.. 不是特别是字符串。即使是 0 和 1 的整数数组也可以。这可能吗?我没有主意了。 @Maverickgugu:你没有问过这个问题吗?在这里得到了回答:***.com/questions/5680367/…【参考方案3】:你问的一个例子:
无符号字符 arr [大小];
【讨论】:
这只是声明。我想知道是否可以将此数组打印为“%s”??【参考方案4】:C 中的字符串只不过是一个接一个的几个字符。如果它们未签名或签名问题不大,您可以轻松地转换它们。
因此,要从 unsigned char 数组中获取字符串,您所要做的就是确保最后一个字节是终止字节 '\0',然后将该数组转换为 char *(或将其复制到数组中)字符)
【讨论】:
谢谢。解决方案看起来很简单。但是我是否将无符号字符数组与字符串连接起来?我应该插入一个空字符作为最后一个元素吗? 嗯,在加密上下文中,这可能不是那么容易,这完全取决于您将如何处理字符串。您必须记住,散列函数的输出可能已经包含 '\0'-bytes,并且您可能最终只处理字符串的一部分,因为如果看到这样的字节,字符串处理函数将停止工作 是的。我完全同意你的推理!【参考方案5】:在 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,则可能会出现无法使用 ASCII 的情况。同样,您的问题不是很清楚。
【讨论】:
我正在使用 MAC,如果其中一个无符号字符具有超级 dooper 值而不是常规 ASCII 值,类型转换是否仍然会给出垃圾值?以上是关于如何在C中将无符号字符数组转换为十六进制字符串的主要内容,如果未能解决你的问题,请参考以下文章