【问题标题】:How to convert long long ASCII hex values into a string?如何将 long long ASCII 十六进制值转换为字符串?
【发布时间】:2011-11-16 05:34:31
【问题描述】:

我有一个 long long 持有 ASCII 十六进制值,并希望将其转换为字符串。我有这个代码:

char myBuffer[8];
long long myLongLong = 0x7177657274797569;
sprintf(myBuffer,"%c%c%c%c%c%c%c%c",myLongLong);
int x;
cout << myBuffer;
cin >> x;
return 0;

十六进制代码应该是"qwertyui",但它总是给出其他值。

我尝试使用%c%s%X,但它没有给我所需的输出,最接近的是%c,但它只打印出一个字符。

【问题讨论】:

    标签: c++ c string hex


    【解决方案1】:

    该代码在很多方面都是错误的,我不知道从哪里开始......

    • myBuffer 太小,无法容纳 8 chars + NUL 终止符,即。应该是myBuffer[9]
    • sprintf 需要 8 个参数,您只传递了 1 个。其他必需的参数将是堆栈中的任何参数。
    • myLongLong 不是 char
    • 您没有考虑字节序。
    • 您正在使用 C 函数并在 C++ 中以 C 方式执行操作。为什么不使用 std::strings 而不是 C 风格的字符串,而使用 stringstreams 作为 sprintf 的替代品?

    您想要的最接近几乎的工作示例,与您的示例类似,类似于:

    #include <cstdio>
    #include <iostream>
    
    using namespace std;
    
    int main(void)
    {
       char myBuffer[9];
       long long myLongLong = 0x7177657274797569;
       char *c_ptr = (char*)&myLongLong;
       sprintf(myBuffer,"%c%c%c%c%c%c%c%c", c_ptr[0], c_ptr[1], c_ptr[2], c_ptr[3], c_ptr[4], c_ptr[5], c_ptr[6], c_ptr[7]);
       int x;
       cout<<myBuffer;
       cin>>x;
       return 0;
    }
    

    这将在我的 little-endian 机器上输出 "iuytrewq"。正如我所提到的,这没有考虑字节序。如果机器是 little-endian,那么您可以反向读取/打印字节。

    我真的不明白你为什么要这样做......

    【讨论】:

    • 谢谢,您的代码可以工作,但反转了:),如何反转它?我正在尝试解密 DES 加密,并且正在尝试最大限度地优化我的代码。
    • @SherifMaherEaid:在该示例中,只需将参数反转为sprintf..., c_ptr[7], c_ptr[6], c_ptr[5], ..., c_ptr[0]
    【解决方案2】:

    你可以试试

    union { char buf[8]; long long num; } u;
    u.num =  0x7177657274797569LL;
    cout << u.str << endl;
    

    但我不明白你真正想要做什么。字节序呢?

    【讨论】:

    • 小端。我正在尝试解密 DES 加密。
    • 您的代码有效。但它是 u.buf 而不是 u.str ,而且 u.buf 在显示时有一些额外的垃圾字符,但是在调试时,我可以看到它包含正确的所有字符,问题只是在显示中。
    【解决方案3】:

    使用字符串流

    long long myLongLong = 0x7177657274797569;
    std::stringstream ss;
    ss << std::hex << myLongLong;
    std::cout << ss << std::endl
    

    【讨论】:

      【解决方案4】:

      您想将 long-long 的每个字节打印为 ascii 字符?

      然后你需要遍历 long long 一次提取一个字节,查看位移和掩码。

      提示通常更容易(如果您知道长度)从最后一个字节开始工作并向右移动

      或者 - 你可以将 long-long 存储到 char 数组中 - 除了任何字节排序问题

      【讨论】:

        【解决方案5】:

        试试下面的代码。

        #include <iostream>
        
        using namespace std;
        
        int main(void)
        {
        
        char myBuffer[8];
        long long myLongLong = 0x7177657274797569;
        
        for(int i = 0; i<8;i++)
        {
            myBuffer[i] = myLongLong>>(64-(i+1)*8);
        }
        
        cout<<myBuffer<<endl;
        
        return 0;
        
        }
        

        【讨论】:

          猜你喜欢
          • 2020-03-14
          • 1970-01-01
          • 2011-07-06
          • 2015-12-18
          • 2019-01-10
          • 2020-08-06
          • 1970-01-01
          • 2011-02-14
          • 2013-10-01
          相关资源
          最近更新 更多