2013-04-24 83 views
0

我有一個接受來自C++/CLI richtextbox的十六進制值的應用程序。
該字符串來自用戶輸入。將字符串格式化爲十六進制並驗證

樣本輸入和預期輸出。

01 02 03 04 05 06 07 08 09 0A //good input 

0102030405060708090A   //bad input but can automatically be converted to good by adding spaces. 

XX ZZ DD AA OO PP II UU HH SS //bad input this is not hex 

01 000 00 00 00 00 00 01 001 0 //bad input hex is only 2 chars 

如何編寫函數:
1.檢測輸入的是否是好還是壞的輸入。
2.如果其輸入有誤,請檢查輸入有什麼不好:不能有空格,不能是十六進制,必須是2字符分割。
3.如果它的空格不是空格,那麼只需自動添加空格。

到目前爲止,我通過搜索像一個空間做了一個空間檢查:

for (int i = 2; i < input.size(); i++) 
{ 
    if(inputpkt[i] == ' ') 
    { 
     cout << "good input" << endl; 
     i = i+2; 
    } 
    else 
    { 
     cout << "bad input. I will format for you" << endl; 
    } 
} 

但它並沒有真正按預期工作,因爲它返回:

01 000 //bad input 
01 000 00 00 00 00 00 01 001 00 //good input 

更新

1檢查輸入是否實際爲十六進制:

bool ishex(std::string const& s) 
{ 
    return s.find_first_not_of("abcdefABCDEF ", 0) == std::string::npos; 
} 

回答

0

您是使用C++/CLI還是使用普通C++?你已經標記了C++/CLI,但是你使用的是std :: string,而不是.Net System::String

我建議這是一個總體規劃:首先,根據任何空格將大字符串拆分爲更小的字符串。對於每個單獨的字符串,確保它只包含[0-9a-fA-F],並且是兩個字符長的倍數。

的實施可以去像這樣:

array<Byte>^ ConvertString(String^ input) 
{ 
    List<System::Byte>^ output = gcnew List<System::Byte>(); 

    // Splitting on a null string array makes it split on all whitespace. 
    array<String^>^ words = input->Split(
     (array<String^>)nullptr, 
     StringSplitOptions::RemoveEmptyEntries); 

    for each(String^ word in words) 
    { 
     if(word->Length % 2 == 1) throw gcnew Exception("Invalid input string"); 

     for(int i = 0; i < word->Length; i += 2) 
     { 
      output->Add((Byte)(GetHexValue(word[i]) << 4 + GetHexValue(word[i+1]))); 
     } 
    } 

    return output->ToArray(); 
} 

int GetHexValue(Char c) // Note: Upper case 'C' makes it System::Char 
{ 
    // If not [0-9a-fA-F], throw gcnew Exception("Invalid input string"); 
    // If is [0-9a-fA-F], return integer between 0 and 15. 
} 
相關問題