C ++将十六进制数转换为人类可读的字符串表示

时间:2013-03-17 18:33:22

标签: string hex

我有一个由ASCII字符组成的字符[32],其中一些字符可能是不可打印的字符,但它们都在0到255的有效范围内。

让我们说,它包含这些数字: {9A 2E 5C 66 26 3D 5A 88 76 26 F1 09 B5 32 DE 10 91 3E 68 2F EA 7B C9 52 66 23 9D 77 16 BB C9 42}

我想在std :: string中打印或存储为“9A2E5C66263D5A887626F109B532DE10913E682FEA7BC95266239D7716BBC942”,但是,如果我使用printf或sprintf将其打印出来,它将生成每个数字的ASCII代表,而是打印出来“ö。\ f& =Zàv&Òμ2fië> h /Í{... Rf#ùwª... B”,这是正确的ASCII字符表示,因为:ö= 9a ,. = 2e,......

如何可靠地获取十六进制数字的字符串表示?即:我期待一个字符[64],其中包含“9A2E5C66263D5A887626F109B532DE10913E682FEA7BC95266239D7716BBC942”。

谢谢!

3 个答案:

答案 0 :(得分:0)

我试过了:

  char szStringRep[64];
  for ( int i = 0; i < 32; i++ ) {
    sprintf( &szStringRep[i*2], "%x", szHash[i] );
  }

它按预期工作,但如果遇到&lt; 0x10数字,它将在打印0时终止,

答案 1 :(得分:0)

您可以将字符串编码为另一个系统,如Base64,在使用加密算法时广泛使用。

答案 2 :(得分:0)

void bytesToHex(char* dest, char* src, int size) {
    for (unsigned int i = 0; i < size; i++) {
        sprintf(&dest[i * 2], "%02x", src[i]);
    }
}

你必须在这里分配自己的记忆。 它会像这样使用:

char myBuffer[32]
char result[65];
bytesToHex(result, myBuffer, 32);
result[64] = 0;

// print it
printf(result);

// or store it in an std::string
std::string str = string(result);