如何将 printf xterm 代码转换为 ostringstream?

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

问题

我正在尝试将一些 C

printf
代码转换为
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)

enter image description here

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";
}
c++ c terminal ansi-escape
2个回答
1
投票

你就快到了。您需要流式传输 转义字符

'\x1b'
而不是 整数
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";
}

0
投票

尝试将

std::hex << static_cast<int>(0x1b) << std::dec
替换为
"\x1b"

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