我有一个由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”。
谢谢!
答案 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);