【问题标题】:Wrong values in raw data to hex string convertion?原始数据中的错误值到十六进制字符串转换?
【发布时间】:2014-06-27 17:11:30
【问题描述】:

我正在使用以下代码将原始数据值转换为十六进制字符串,以便找到一些信息。但我得到了 FFFFFFFF 我应该得到 FF 的地方。

例如,结果应该是“FF 01 00 00 EC 00 00 00 00 00 00 00 00 00 E9”,但我得到的是“FFFFFFFFF 01 00 00 FFFFFFEC 00 00 00 00 00 00 00 00 00 FFFFFFE9”。

有人知道这里发生了什么吗?

std::vector<unsigned char> buf;
buf.resize( ANSWER_SIZE);

// Read from socket
m_pSocket->Read( &buf[0], buf.size() );
string result( buf.begin(), buf.end() );
result = ByteUtil::rawByteStringToHexString( result );

std::string ByteUtil::int_to_hex( int i )
{
    std::stringstream sstream;
    sstream << std::hex << i;
    return sstream.str();
}

std::string ByteUtil::rawByteStringToHexString(std::string str)
{
    std::string aux = "", temp = "";
    for (unsigned int i=0; i<str.size(); i++) {
        temp += int_to_hex(str[i]);

        if (temp.size() == 1) {
            aux += "0" + temp + " "; // completes with 0
        } else if(i != (str.size() -1)){
            aux += temp + " ";
        }
        temp = "";
    }

    // System.out.println(aux);
    return aux;
}

更新:调试时,我注意到 int_to_hex 返回的是 FFFFFFFF 而不是 FF。我该如何解决?

【问题讨论】:

  • 了解sign extension
  • 另外,您知道使用std::istringstream 会非常简单。
  • FFFFFF.. 表明您遇到了签名问题。如果一个 1 字节值的第一位是 '1',那么它就是一个负数,当你将它转换为一个 4 字节值(一个 int)时,它前面会有很多 F。
  • @JoachimPileborg 我按照他们的建议做了here,但我得到了相同的结果。我对 c++ 很陌生,我从 Java 中添加了上面的代码,它可以正常工作。

标签: c++ hex stdstring data-conversion


【解决方案1】:

注意在int_to_hex() 中使用unsigned 而不是int

#include <iostream>
#include <sstream>

std::string int_to_hex(unsigned i)
{
    std::stringstream sstream;
    sstream << std::hex << i;
    return sstream.str();
}

int main() {
    std::cout << int_to_hex(0xFF) << "\n";
}

输出

[1:58pm][wlynch@watermelon /tmp] ./foo
ff

另外...

我们还可以在question you are looking at 中看到,他们执行 static_cast 以达到相同的结果。

ss << std::setw(2) << static_cast<unsigned>(buffer[i]);

【讨论】:

  • 嗨@sharth。感谢你的回复。我做了这个改变,但仍然没有成功。我实际上并没有尝试打印它,而是使用此结果与正则表达式匹配,从而从中提取一些信息。我正在做的正是:将套接字答案读入 vector;通过以下方式将其内容传递到字符串中: string result( buf.begin(), buf.end() );然后我调用 rawByteStringToHexString。
  • @RafaelTSCS:所以你的编辑说你已经将问题减少到返回FFFFFFFF而不是你想要的FF的函数。除此之外还有其他问题吗?您已经讨论了如何使用它,但您需要说:我希望输出为 foo。我的代码当前产生的输出是 bar。
  • 我需要 int_to_hex 来返回 FF 而不是 FFFFFFFF。我已将代码编辑到问题中,所以我展示了我是如何读取套接字的。
【解决方案2】:

好的,伙计们,抱歉耽搁了,我周末正好有一些 FIFA 世界杯比赛要看。

无论我做了什么更改,我都得到了相同的结果,所以我决定在之前对代码进行一些更改,然后我将输入参数从

std::string ByteUtil::rawByteStringToHexString(std::string str)

std::string ByteUtil::rawByteStringToHexString(vector<unsigned char> v)

并且还保留了@sharth 建议的更改。现在我得到了正确的结果。

谢谢大家的帮助!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-24
    • 2021-03-05
    • 2021-06-24
    • 2018-01-22
    • 2018-05-26
    • 2013-06-17
    • 2012-01-24
    • 2011-11-12
    相关资源
    最近更新 更多