将IDC_Edit文本转换为十六进制WORD

时间:2013-05-05 14:18:59

标签: c++ winapi

我有一个IDC_Edit文本框设置,它将接受我想要转换为WORD的十六进制空格分隔值。我想让控件模仿数组,但我真的不确定如何完成转换。

基本上,如果我输入:

"12 AB"

我需要得到的WORD相等:

0x12AB

作为一个很少涉及C ++的人,更不用说WinAPI,我真的很难过如何做到这一点。我目前的代码是:

HWND hTextInput = GetDlgItem(hWnd, IDC_EDIT);
DWORD dwInputLength = Edit_GetTextLength(hTextInput);

char* resultString = new char[dwInputLength+1];
memset(hTextInput , 0, dwInputLength+1);

WORD result = (resultString[0] << 8) | resultString[1];

这会拉出IDC_EDIT控件的文本和长度,并将其转换为char*数组。然后尝试转换为WORD,但显然这只占前两个字符(12)。

如何将此"12 AB"拉入char*数组[0x12, 0xAB](而不是["1", "2", "A", "B"]),以便我可以将两个字节转换为WORD?

1 个答案:

答案 0 :(得分:1)

试试这个:

WORD Readhex(const char *p)
{
  char c ;
  WORD result = 0 ;

  while (c = *p++)
  {
    if (c >= '0' && c <= '9')
      c -= '0' ;
    else if (c >= 'A' && c <= 'F')
      c -= 'A' - 10 ;
    else if (c >= 'a' && c <= 'f')
      c -= 'a' - 10 ;
    else
      continue ;

    result = (result << 4) + c ;
  }

  return result ;
}

...
HWND hTextInput = GetDlgItem(hWnd, IDC_EDIT);
DWORD dwInputLength = Edit_GetTextLength(hTextInput);

char* resultString = new char[dwInputLength+1];
GetWindowText(hTextInput, resultString, dwInputLength+1) ;

WORD result = ReadHex(resultString) ;

你也忘记了GetWindowText;并且不需要用零(memset)填充缓冲区。 建议的strtol函数不适合您,因为strtol会将空间视为终止符。也许您还应该考虑进行一些错误检查,例如,如果用户输入垃圾。上面的ReadHex函数只是忽略任何非十六进制数字。