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("0123456789abcdefABCDEF ", 0) == std::string::npos;
}
4

1 回答 1

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.
}
于 2013-04-25T19:23:48.133 回答