【问题标题】:C++ converting hex number to human readable string representationC ++将十六进制数字转换为人类可读的字符串表示
【发布时间】:2013-03-17 18:33:22
【问题描述】:

我有一个由 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”。

谢谢!

【问题讨论】:

    标签: string hex


    【解决方案1】:
    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);
    

    【讨论】:

    • 是的! %02x,非常感谢!我在 sprintf 循环之后又做了一个 for 循环,将 '\0' 转换为 '0',真是太愚蠢了..
    【解决方案2】:

    我试过了:

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

    它按预期工作,但如果遇到

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我在考虑...但是系统需要十六进制字符串。 Base64 可能需要另一个步骤来转义字符串。比如同样的数据,生成AC5cZiY9Woh2JvEJtTLeEJE+aC/qe8lSZiOddxa7yUI=
      猜你喜欢
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 2015-05-28
      • 1970-01-01
      • 2017-08-12
      • 2018-08-20
      • 2012-09-13
      相关资源
      最近更新 更多