如何使用ostringstream在c ++中记录十六进制字符串?

问题描述 投票:0回答:3

我正在尝试将十六进制值记录到ostringstream,但它不起作用。我尝试着:

unsigned char buf[4];
buf[0] = 0;
buf[1] = 1;
buf[2] = 0xab;
buf[3] = 0xcd;
std::ostringstream e1;
e1 << "0x" << std::setfill('0') << std::setw(3) << std::hex << buf[0] << " " << "0x" << std::setfill('0') << std::setw(3) << std::hex << buf[1] << " " << "0x" << std::setfill('0') << std::setw(3) << std::hex << buf[2] << " " << "0x" << std::setfill('0') << std::setw(3) << std::hex << buf[3];
std::cout << e1.str() << std::endl;

我期待得到类似“0x00 0x01 0xab 0xcd”的东西,但我得到“0x00”。

我也尝试过打破它

    e1 << "0x" << std::setfill('0') << std::setw(3) << std::hex << buf[0];
    e1 << " ";
    e1 << "0x" << std::setfill('0') << std::setw(3) << std::hex << buf[1];
    e1 << " ";
    e1 << "0x" << std::setfill('0') << std::setw(3) << std::hex << buf[2];
    e1 << " ";
    e1 << "0x" << std::setfill('0') << std::setw(3) << std::hex << buf[3];

但得到同样的事情。

c++ hex ostringstream
3个回答
1
投票

我假设,这里的主要问题是你的stringstream对char的解释。尝试将它投射到int,一切都像魅力一样:

#include <iostream>
#include <sstream>
#include <iomanip>

using namespace std;

int main()
{
  unsigned char buf[4];
  buf[0] = 0;
  buf[1] = 1;
  buf[2] = 0xab;
  buf[3] = 0xcd;

  ostringstream e1;
  for (uint i=0; i< sizeof(buf); ++i)
  {
    e1  << "0x" << std::setw(2) << std::setfill('0') << std::hex << static_cast<int>(buf[i]) << " ";
  }

  cout << e1.str() << endl;

  return 0;
}

这为您提供了所需的输出:

0x00 0x01 0xab 0xcd 

1
投票

问题是输出流中的字符不被视为整数,因此整数操纵符不会影响它们的输出。

基本上......替换

unsigned char buf[4];

unsigned int buf[4];

1
投票

这有效:

e1         << "0x" << std::setfill('0') << std::setw(2) << std::hex << (int)buf[0]
    << " " << "0x" << std::setfill('0') << std::setw(2) << std::hex << (int)buf[1]
    << " " << "0x" << std::setfill('0') << std::setw(2) << std::hex << (int)buf[2]
    << " " << "0x" << std::setfill('0') << std::setw(2) << std::hex << (int)buf[3];

我已经向(int)添加了强制转换并更改了setw(2)。

© www.soinside.com 2019 - 2024. All rights reserved.