3

比较两个十六进制数字(即字符串)的最佳方法是什么?例如,

string a = "3F";
string b = "32";

if (a > b)
   MessageBox.Show("a is greater");

应该管用。(假设 > 已正确重载)。

4

4 回答 4

9

您始终可以将它们转换为整数并以这种方式进行比较:

int a = int.Parse("3E", System.Globalization.NumberStyles.HexNumber);
int b = int.Parse("32", System.Globalization.NumberStyles.HexNumber);

if (a > b)
    MessageBox.Show("a is greater");

似乎更安全:)

于 2012-08-21T01:09:05.407 回答
3

将它们转换为整数并比较整数。

于 2012-08-21T01:07:15.523 回答
2

还有一个基于字符串比较的简单算法:假设您的数字具有独特的格式:总是小写或大写字母。是否前导 0x,没有前导零。然后你可以这样做:如果数字 a 的位数比数字 b 多: a > b

如果位数相等,您可以使用 String.Compare。

该算法的优点是不限于 32 位或 64 位。

于 2012-08-21T16:47:10.177 回答
1

这是亨德里克建议的一个相当强大的实现。如果您的输入字符串具有已知属性,则可以通过多种方式对其进行优化,但它应该能够比较任何大小和/或混合格式的有效十六进制字符串。

public int HexStringCompare(string value1, string value2)
{
    string InvalidHexExp = @"[^\dabcdef]";
    string HexPaddingExp = @"^(0x)?0*";
    //Remove whitespace, "0x" prefix if present, and leading zeros.  
    //Also make all characters lower case.
    string Value1 = Regex.Replace(value1.Trim().ToLower(), HexPaddingExp, "");
    string Value2 = Regex.Replace(value2.Trim().ToLower(), HexPaddingExp, "");

    //validate that values contain only hex characters
    if (Regex.IsMatch(Value1, InvalidHexExp))
    {
        throw new ArgumentOutOfRangeException("Value1 is not a hex string");
    }
    if (Regex.IsMatch(Value2, InvalidHexExp))
    {
        throw new ArgumentOutOfRangeException("Value2 is not a hex string");
    }

    int Result = Value1.Length.CompareTo(Value2.Length);
    if (Result == 0)
    {
        Result = Value1.CompareTo(Value2);
    }

    return Result;
}

用它来回答OP的问题:

if (HexStringCompare(a, b) > 0)
   MessageBox.Show("a is greater");
于 2013-03-26T13:32:52.693 回答