比较两个C ++十六进制字符串

时间:2016-06-29 17:22:21

标签: c++ string hex

如果我有两个std :: strings包含一个任意长度的十六进制值,我怎么能比较两个看看哪个值更大?理想情况下,我希望避免使用大量的库。

我想做点什么:

if(hex1 > hex2)
{
    //Do something
}

3 个答案:

答案 0 :(得分:2)

您可以对这些数字进行字符串比较,但有几个潜在的问题需要考虑:

  1. 符号字符(“+ 0X2A”将在“0X0D”之前订购)
  2. 存在“0X”(“0X2”将在“0D”之前订购)
  3. “0X”的大写(“0X2A”将在“0x0D”之前订购)
  4. 十六进制数字的大小写(“0X0D”将在“0X0a”之前订购)
  5. 数字的零填充(“0X002A”将在“0X0D”之前订购)
  6. 考虑所有这些条件及其潜在的组合将是一个真正的头痛。 C ++ 11引入了类型unsigned long long int,它至少是一个64位无符号整数。如果你的输入超过了那个不起作用,你将需要解析字符串。

    这会给你一个高达16个十六进制字符的输入值。
    if(stoll(hex1, 0, 16) > stoll(hex2, 0, 16)
    

答案 1 :(得分:0)

首先修剪前导零。

如果长度不等,则长度越大。

如果长度相等,则从头开始循环并比较每个数字。无论哪个字符串首先在相同位置具有较大数字而另一个字符串较大。 如果到达最后且所有数字相等,则值相等。

答案 2 :(得分:0)

如果您使用std::string。适用于ASCII编码。

bool hex_greater(std::string &first, std::string &second)
{
    /* Comprasions based on size */
    int firstSize = first.size(); 
    int secondSize = second.size();
    if(firstSize > secondSize)
        return true;
    else if(firstSize < secondSize)
        return false;

    /* Convert to lower case, for case insentitive comprasion */
    std::transform(first.begin(), first.end(), first.begin(), ::tolower);
    std::transform(second.begin(), second.end(), second.begin(), ::tolower);

    /* Call the std::string operator>(...) which compare strings lexicographically */
    if(first > second)
        return true;

    /* In other cases first hex string is not greater */
    return false;
}