如何在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 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,则可能会出现无法使用 ASCII 的情况。同样,您的问题不是很清楚。

【讨论】:

我正在使用 MAC,如果其中一个无符号字符具有超级 dooper 值而不是常规 ASCII 值,类型转换是否仍然会给出垃圾值?

以上是关于如何在C中将无符号字符数组转换为十六进制字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何将十六进制字符串转换为无符号字符数组?

如何在 C 中将字节数组转换为十六进制字符串?

在 C 中将 int 转换为 2 字节的十六进制值

如何在C中将十六进制字符串转换为二进制字符串?

如何在 Swift 中将 Int 转换为十六进制字符串

如何在 C++ 中将字节数组转换为十六进制字符串?