我有一个接受来自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("0123456789abcdefABCDEF ", 0) == std::string::npos;
}
答案 0 :(得分: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.
}