2つの16進数(つまり文字列)を比較する最良の方法は何ですか?例えば、
string a = "3F";
string b = "32";
if (a > b)
MessageBox.Show("a is greater");
動作するはずです。(>が適切にオーバーロードされていると仮定します)。
いつでもそれらを 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");
より安全に思えます:)
それらを整数に変換し、整数を比較します。
文字列の比較に基づく単純なアルゴリズムもあります。数値が一意の形式であると想定します。常に小文字または大文字です。先行ゼロの有無にかかわらず、先行ゼロはありません。次に、次のように実行できます。数値aの桁数が数値bより多い場合:a> b
桁数が等しい場合は、String.Compareを使用できます。
このアルゴリズムには、32ビットまたは64ビットに制限されないという利点があります。
これは、ヘンドリックの提案のかなり堅牢な実装です。入力文字列に既知の属性がある場合に最適化できる方法はいくつかありますが、任意のサイズの有効な 16 進文字列および/または混合形式の有効な 16 進文字列を比較できるはずです。
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");