2013-12-05 2 views
0

Следующий код показывает шестнадцатеричный код 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 для определения шестнадцатеричного значения. Он должен представлять шестнадцатеричное значение каждого символа массива символов.

так как отобразить этот массив символов как один блок?

+0

Win32's CryptBinaryToString он может пригодиться для этого –

ответ

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()); 
} 

Вам необходимо включить все заголовки ios, iomanip и sstream для этой версии.

+0

большое спасибо .. :) – user3048644

+0

@ user3048644 Поскольку вы новичок в StackOverflow, если вы нашли ответ полезным, вы можете указать это [принять его] (http://meta.stackoverflow.com/help/someone-answers). – Praetorian

+0

Использование 'strlen (temp)' в цикле будет постепенно замедлять цикл по мере его повторения (не так уж плохо в этом примере, но может быть проблемой для более крупных буферов). Вы должны использовать отдельную переменную, которая инициализируется до 0 и увеличивается после каждого 'sprint()', а затем использовать окончательное значение для нулевого окончания буфера (избегая необходимости инициализировать буфер раньше): 'int idx = 0 ; для (...) {idx + = sprintf (& temp [idx], "% 02X", testBuffer [i]); } temp [idx]: = 0; 'Или вы можете использовать счетчик циклов в качестве индекса:' int i = 0; for (...; ++ i) {sprintf (& temp [i * 2], "% 02X", testBuffer [i]); } tmp [i] = 0; ' –

0

Попытка формирования каждое шестнадцатиричное значение в одну строку, в CONCAT их в другую:

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) ; 
Смежные вопросы