【问题标题】:Decimal to Hexadecimal Functions in C++/CLIC++/CLI 中的十进制到十六进制函数
【发布时间】:2013-08-06 13:11:14
【问题描述】:

我有一个程序通过串行端口与设备通信。然而,我在一个部分遇到了困难。当我运行计算出的十六进制命令时,我得到了一个看起来像直角符号的东西。下面是两段代码(主要部分和函数)。

主要部分:

private: System::Void poll_Click(System::Object^  sender, System::EventArgs^  e)
     {
            int i, end;
            double a = 1.58730159;
            String^ portscan = "port";
            String^ translate;
            std::string portresponse [65];
            std::fill_n(portresponse, 65, "Z");

            for (i=0;i<63;i++)
            {
                if(this->_serialPort->IsOpen)
                {
                    // Command 0 generator
                    int y = 2;
                    y += i;
                    std::string command0[10] = {"0xFF", "0xFF", "0xFF", "0xFF", "0xFF", "0x02", dectohex(i), "0x00", "0x00", dectohex(y)};

                    // The two "dectohex" values above is where I get the odd symbol

                    for (end=0;end<10;end++)
                    {
                        portscan = marshal_as<String^>( command0[end] );
                        this->_serialPort->WriteLine(portscan);
                    }

                    translate = (this->_serialPort->ReadLine());
                    MarshalString(translate, portresponse [i]);
                    if(portresponse [i] != "Z")
                    {
                        comboBox7->Items->Add(i);
                    }
                    this->progressBar1->Value=a;
                    a += 1.58730159;
                }
            }


     }

功能:

string dectohex(int i)
     {
        string hexidecimal = "";
        char hex_string[10] = "";
        hexidecimal = sprintf (hex_string, "0x%02X", i);
        return hexidecimal;
     }

我假设我缺少一些相当简单的东西。感谢您提供任何和所有帮助。


解决办法: 根据 David Yaw 的指导。

    string dectohex(int i)
         {
            char hex_array[10];
            sprintf (hex_array, "0x%02X", i);
            string hex_string(hex_array);
            return string(hex_string);
         }

【问题讨论】:

  • 在编写可读的 C++ 之前,必须学习如何拼写十六进制。
  • 感谢您指出这一点,我一定是在匆忙尝试修复我的代码时错过了这一点。我很高兴我没有在标题或描述中错过它。

标签: c++ c++-cli


【解决方案1】:

sprintf 的返回值不是字符串,正如您当前编写的那样。它是写入作为第一个参数传入的char* 的字符数。使用您传入的字符缓冲区,并将char* 转换为字符串对象。

string dectohex(int i)
{
    char hex_string[10];
    sprintf (hex_string, "0x%02X", i);
    return string(hex_string);
}

【讨论】:

    【解决方案2】:

    不要使用 sprintf ....
    请改用 stringstream

    #include <sstream>
    
    string dectohex(int i)
    {
        stringstream str;
        str << std::hex << i;
        return str.str();
    }
    

    要获得与以前完全相同的文本:

     str << "0x" << std::setfill('0') << std::setw(2) << std::hex << i;
    

    【讨论】:

    • 太棒了,我不再得到奇怪的符号了,但现在我得到了 0 和 2。如果我正确地遵循了这一点,这意味着 dectohex 函数除了返回的值之外没有返回值给它(在这种情况下是 y)。我应该在函数本身中添加一些东西来完成转换的转换/存储吗? (我尝试在 MSDN 上查找 stringstream 以尝试排除故障,但是几乎没有帮助)
    • @Andy 我已经更新了答案,所以你会得到与以前完全相同的结果。
    • 我试过这个把 "str
    猜你喜欢
    • 2011-12-09
    • 2011-06-01
    • 1970-01-01
    • 2019-03-02
    • 2013-11-30
    • 2018-07-26
    • 2014-04-18
    • 2014-11-30
    • 2020-02-09
    相关资源
    最近更新 更多