以十六进制或十进制形式打印到stdout,将std :: string作为字节序列

时间:2015-06-29 17:40:27

标签: c++ string c++11 hex stdout

我正在使用的API返回一个字节序列作为std :: string。

如何将其打印到stdout,格式化为序列,十六进制或十进制。

这是我正在使用的代码:

        int8_t i8Array[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
        std::string i8InList(reinterpret_cast<const char*>(i8Array), 16);
        std::string i8ReturnList;

        client.GetBytes(i8ReturnList, i8InList);

        cout << "GetBytes returned ";
        std::copy(i8ReturnList.begin(), i8ReturnList.end(),   std::ostream_iterator<int8_t>(std::cout << " " ));

我希望收到相同的输入,但顺序相反。但是这段代码打印的是:

GetBytes returned   ☺☻♥♦♣
♫☼

注意:字节序列是一个任意的字节序列,它不是书面语言的表示。

2 个答案:

答案 0 :(得分:3)

流将这些字节解释为字符,当控制台获取这些字符时,它将显示它应显示的编码。

使用例如intstd::ostream_iterator模板参数,而不是将其打印为数字。

答案 1 :(得分:3)

您可能希望将char中存储的std::string转换为int,因此std::cout不会将它们打印为字符,但就像普通整数。
要使用十六进制打印它们,请使用std::hex,如下面的可编辑代码段(live on Ideone)中所示:

#include <iostream>
#include <string>
using namespace std;

inline unsigned int to_uint(char ch)
{
    // EDIT: multi-cast fix as per David Hammen's comment
    return static_cast<unsigned int>(static_cast<unsigned char>(ch));
}

int main()
{
    string data{"Hello"};

    cout << hex;
    for (char ch : data)
    {
        cout << "0x" << to_uint(ch) << ' '; 
    }
}

<强>输出:

  

0x48 0x65 0x6c 0x6c 0x6f