如何在单个块中显示十六进制值

时间:2013-12-05 05:49:00

标签: c++ winapi char

以下代码在循环时逐个显示testbuffer的十六进制代码。

char testBuffer[5] = {0x42, 0x54, 0x43, 0x56, 0x42};

for (int i=0; i<5; i++)
{
    char temp[255];
    sprintf(temp, _T("%X"), testBuffer[i]);
    HWND hWnd = GetDlgItem(hDlg, IDC_STATIC_READ); 
    if(hWnd)
    {
        SetWindowText(hWnd, temp);
    }
}

但我希望使用不使用循环的单个变量来显示testbuffer的所有值。因为我必须使用SetWindowText一次不显示循环。

我用char来定义十六进制值。它表示字符数组的每个字符的十六进制值。

那么如何将这个字符数组显示为单个块呢?

2 个答案:

答案 0 :(得分:0)

尝试将每个十六进制值组合成一个字符串,将它们连接成另一个字符串:

char tempword[16] ;
char temp[255] ;

* tempword= '\0' ;
for (int i= 0; ( i < 5 ) ; i ++ )
{
  sprintf(tempword, "%X", testBuffer[i] ) ;
  strcat( temp, tempword ) ;
}
...
SetWindowText( hWnd, temp ) ;

答案 1 :(得分:0)

移动字符串缓冲区的定义并在循环外调用SetWindowText

char testBuffer[5]={0x42,0x54,0x43,0x56,0x42};
char temp[255] = {0};  // zero initialize

for (int i=0; i<5; i++)
{
  sprintf(&temp[strlen(temp)], "%02X", testBuffer[i]);
}

HWND hWnd = GetDlgItem(hDlg, IDC_STATIC_READ); 
if ( hWnd )
{
  SetWindowText(hWnd, temp);
}

将表达式&temp[strlen(temp)]作为第一个参数传递给sprintf将导致它始终附加到缓冲区中的现有字符串,这就是为什么在开始时对初始化零初始化很重要的原因。另请注意,_T(...)宏与sprintf的使用可能会导致编译器错误,因为该函数不喜欢宽字符串。


另一种尽可能使用标准C ++的解决方案。

char testBuffer[5]={0x42,0x54,0x43,0x56,0x42};
std::ostringstream oss;

oss << std::hex << std::setfill('0') << std::uppercase;

for(int i : testBuffer) 
{
  oss << std::setw(2) << i;
}

HWND hWnd = GetDlgItem(hDlg, IDC_STATIC_READ); 
if ( hWnd )
{
  SetWindowText(hWnd, oss.str().c_str());
}

您需要在此版本中加入标题iosiomanipsstream