比较两个十六进制数字(即字符串)的最佳方法是什么?例如,
string a = "3F";
string b = "32";
if (a > b)
MessageBox.Show("a is greater");
应该有效。 (假设>已正确重载)。
答案 0 :(得分:8)
您始终可以将它们转换为int并以这种方式进行比较:
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");
似乎更安全:)
答案 1 :(得分:3)
将它们转换为整数并比较整数。
答案 2 :(得分:2)
还有一个基于String comparisson的简单算法: 假设您的号码具有独特的格式:始终为小写或更高的大小写字母。前导0x或不前导,没有前导零。然后你可以这样做: 如果数字a的数字多于数字b:a> B'/ P>
如果位数相等,可以使用String.Compare。
这个算法的优点是不限于32位或64位。
答案 3 :(得分: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");