1

问题

我正在尝试将一些 Cprintf代码转换为std::ostringstream,但我在使用十六进制/终端编码时遇到了问题。我想也许,这个序列\x1b[48;5;需要立即翻译,但我不确定 C++ 中的等价物是什么。

不良结果,部分 (C++)

Color cube, 6x6x6:
1b[48;5;10m  1b[48;5;10m  1b[48;5;11m  1b[48;5;11m  1b[48;5;12m  1b[48;5;12m  1b[48;5;13m  1b[48;5;13m  1b[48;5;14m  1b[48;5;14m  1b[48;5;15m  1b[48;5;15m  1b[0m 1b[48;5;34m  1b[48;5;34m  1b[48;5;35m  

好结果,xterm (C)

在此处输入图像描述

C代码

void Color_Cube()
{
  for (unsigned green=0; green<6; ++green)
  {
    for (unsigned red=0; red<6; ++red)
    {
      for (unsigned blue=0; blue<6; ++blue)
      {
        unsigned color = 16 + (red * 36) + (green * 6) + blue;
        printf( "\x1b[48;5;%dm  ", color );
      }
      printf( "\x1b[0m " );
    }
    printf( "\n" );
  }
}

失败的 C++ 代码

void Color_Cube_cpp()
{
  std::ostringstream  oss;
  for (unsigned green=0; green<6; ++green)
  {
    for (unsigned red=0; red<6; ++red)
    {
      for (unsigned blue=0; blue<6; ++blue)
      {
        unsigned color = 16 + (red * 36) + (green * 6) + blue;
        oss << std::hex << static_cast<int>(0x1b) << std::dec
          << "[48;5;" << color << "m  ";
      }
      oss << std::hex << static_cast<int>(0x1b) << std::dec << "[0m ";
    }
    oss << "\n";
  }
  std::cerr << oss.str() << "\n";
}
4

2 回答 2

1

You are almost there. You need to stream the escape character '\x1b' instead of integer 0x1b:

#include <sstream>
#include <iostream>

void Color_Cube_cpp()
{
  std::ostringstream  oss;
  for (unsigned green=0; green<6; ++green)
  {
    for (unsigned red=0; red<6; ++red)
    {
      for (unsigned blue=0; blue<6; ++blue)
      {
        unsigned color = 16 + (red * 36) + (green * 6) + blue;
          oss << "\x1b[48;5;" << color << "m  ";
      }
      oss << "\x1b[0m ";
    }
    oss << "\n";
  }
  std::cerr << oss.str() << "\n";
}
于 2013-06-01T07:46:39.247 回答
0

Try replacing std::hex << static_cast<int>(0x1b) << std::dec with "\x1b".

于 2013-06-01T07:41:55.477 回答