Как записать шестнадцатеричную строку в c ++ с помощью ostringstream? - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь записать шестнадцатеричные значения в 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];

но получите то же самое.

Ответы [ 3 ]

1 голос
/ 11 марта 2019

Это работает:

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).

1 голос
/ 11 марта 2019

Я предполагаю, что главной проблемой здесь является интерпретация 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 голос
/ 11 марта 2019

Проблема в том, что символы не обрабатываются как целые числа в выходном потоке, и поэтому целочисленные манипуляторы не влияют на их вывод.

В основном ... заменяют

unsigned char buf[4];

на

unsigned int buf[4];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...