7

.NET には、PHP のbase_convertと同等のネイティブ関数がありますか?それとも独自に作成する必要がありますか? 任意の基数から他の基数に変換したい - ここで、「to」基数または「from」基数は 2 ~ 36 の任意の整数にすることができます。

PHP 関数の例: base_convert($number_to_convert, $from_base, $to_base)

// convert 101 from binary to decimal
echo base_convert('101', 2, 10);
// 5

Jon Skeet の回答のコメントで Luke が指摘したように: Convert.ToString は、任意のベースとの間の変換を処理できません。2、8、10、および 16 のみです。

更新:どうやら、答えは: いいえ、ネイティブな方法はありません。以下に、Erik がこれを行う 1 つの方法を示します。別の実装はこちら: http://www.codeproject.com/KB/macros/Convert.aspx

4

3 に答える 3

12

編集:この回答は非常に便利ですが、基数 2、8、10、および 16 でのみ機能します

あなたが使用することができConvert.ToInt32(text, base)ますConvert.ToString(number, base)

using System;

class Test
{
    static void Main()
    {
        int number = Convert.ToInt32("101", 2);
        string text = Convert.ToString(number, 10);
        Console.WriteLine(text); // Prints 5
    }
}

基数 10 との間で変換する場合は、指定する必要はありません。これがデフォルトです。

これは基数 2、8、10、および 16 でのみ機能することに注意してください。それ以外のものが必要な場合は、独自のパーサー/フォーマッターを作成する必要があります。

于 2009-03-26T17:47:29.287 に答える
10

整数を 36 までの任意の基数に変換し、基数 x の値の文字列表現を (基数が与えられた場合) 整数に変換するコードを次に示します。

class Program {
    static void Main(string[] args) {
        int b10 = 123;
        int targetBase = 5;

        string converted = ConvertToBase(b10, targetBase);
        int convertedBack = ConvertFromBase(converted, targetBase);

        string base3 = "212210";
        string base7 = ConvertFromBaseToBase(base3, 3, 7);

        Console.WriteLine(converted);
        Console.WriteLine(convertedBack);
        Console.WriteLine(base7);
        Console.ReadLine();
    }

    private const string chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    private static string ConvertToBase(int b10, int targetBase) {
        if (targetBase < 2) throw new ArgumentException("Target base must be greater than 2.", "targetBase");
        if (targetBase > 36) throw new ArgumentException("Target base must be less than 36.", "targetBase");

        if (targetBase == 10) return b10.ToString();

        StringBuilder result = new StringBuilder();

        while (b10 >= targetBase) {
            int mod = b10 % targetBase;
            result.Append(chars[mod]);
            b10 = b10 / targetBase;
        }

        result.Append(chars[b10]);

        return Reverse(result.ToString());
    }

    private static int ConvertFromBase(string bx, int fromBase) {
        if (fromBase < 2) throw new ArgumentException("Base must be greater than 2.", "fromBase");
        if (fromBase > 36) throw new ArgumentException("Base must be less than 36.", "fromBase");

        if (fromBase == 10) return int.Parse(bx);

        bx = Reverse(bx);
        int acc = 0;

        for (int i = 0; i < bx.Length; i++) {
            int charValue = chars.IndexOf(bx[i]);
            acc += (int)Math.Pow(fromBase, i) * charValue;
        }

        return acc;
    }

    public static string ConvertFromBaseToBase(string bx, int fromBase, int toBase) {
        int b10 = ConvertFromBase(bx, fromBase);
        return ConvertToBase(b10, toBase);
    }

    public static string Reverse(string s) {
        char[] charArray = new char[s.Length];
        int len = s.Length - 1;
        for (int i = 0; i <= len; i++)
            charArray[i] = s[len - i];
        return new string(charArray);
    }
}

これらの値を表示することに関心がない場合は、chars セットで拡張文字を使用できます。単純な ascii に固執する場合、理論的には base256 値を使用できます。それを超えて、文字を使用しないことをお勧めしますが、代わりに他の一意に識別可能な値を使用することをお勧めします-ただし、値はあまりわかりません.

于 2009-03-26T18:34:11.843 に答える
1

ConvertToBaseでは、次の行があります。

while(b10> targetBase)

...次のようになります:

while(b10> = targetBase)

これは、変換された数値にポップアップする基数を処理します(たとえば、「3」を基数3に変換すると、「10」ではなく「3」が生成されます)。

于 2009-07-29T15:17:31.330 に答える