0

我有一个由 ASCII 字符组成的 char[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, ...

如何可靠地获取十六进制数字的字符串表示形式?即:我希望 char[64] 包含“9A2E5C66263D5A887626F109B532DE10913E682FEA7BC95266239D7716BBC942”。

谢谢!

4

3 回答 3

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);
于 2013-03-17T18:52:44.873 回答
0

我试过了:

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

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

于 2013-03-17T18:34:24.243 回答
0

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

于 2013-03-17T18:35:32.010 回答