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

时间:2011-04-14 09:28:52

标签: c string types

是否可以将无符号字符数组表示为字符串?

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

上下文:我正在尝试存储加密哈希函数的输出,该函数恰好是无符号字符数组。
例如:

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

我的目标是将数据表示为字符串(%s),而不是每个元素访问它。因为我需要将哈希的输出作为字符串进行进一步处理。

谢谢!

5 个答案:

答案 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 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的系统,那么在执行此操作的情况下可能会出现问题。同样,你的问题不是很清楚。

答案 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];