Powiedzmy, że mam ciąg, który zawiera binarny, tak:

string test = "01001010";

Więc chcę zrobić coś takiego:

someFunc(test);

A ta funkcja zwróci dokładnie to, co mówi zmienna testowa, ale w postaci bajtów zamiast ciągu.

Przykład:

using System;

class Program
{
    static void Main()
    {
        Console.WriteLine(Convert.ToChar(someFunc(Console.ReadLine())));
    }
}

Ten program prosi o wprowadzenie bajtu za pomocą Console.ReadLine (która zwraca łańcuch), zamienia go na bajt, a następnie zamienia go na znak.

Jak mogłem to zrobić?

0
SoilFoil 21 czerwiec 2021, 09:32

4 odpowiedzi

Najlepsza odpowiedź

Użyj Convert.ToInt32(string, int) gdzie string jest ciągiem, który chcesz przekonwertować, a int jest podstawą systemu liczbowego, z którego chcesz przekonwertować, w twoim przypadku o podstawie 2 lub binarnej. Lub jeśli naprawdę bardzo potrzebujesz, aby był to bajt, możesz użyć Convert.ToByte(string, int). Tak jak:

using System;

class Program
{
    public static void Main()
    {
        var input = Console.ReadLine(); // 01001010
        var number = Convert.ToInt32(input, 2);
        Console.WriteLine(number); // prints '74'
    }
}

Ostrzegamy, że Convert.ToXyz() zgłosi wyjątek typu FormatException, jeśli podany ciąg wejściowy zawiera znak, który jest niedozwolony dla danej bazy. W przypadku bazy 2, która byłaby dowolnym znakiem, który nie jest 0 ani 1, możesz chcieć przechwycić takie wyjątki lub sprawdzić, czy wszystkie znaki w ciągu wejściowym mają wartość „0” lub „1” uprzednio

0
MindSwipe 21 czerwiec 2021, 08:03

Możesz to napisać w ten sposób:

using System;

    class Program
    {
        static byte someFunc(string text)
        {
                byte t = 0;
                for (int i = 0; i < 8; i++)
                         t = (byte)(t * 2 + (text[i] - '0'));
                return t;
        }
        static void Main()
        {
            Console.WriteLine(Convert.ToChar(someFunc(Console.ReadLine())));
        }
    }

Ale przed użyciem funkcji someFunc() przydałoby się sprawdzić, czy ciąg nie jest prawidłowy (na przykład, czy zostanie wyświetlony komunikat o błędzie, jeśli dane wejściowe to „10102010”)

1
Bomber Cubit 21 czerwiec 2021, 07:05

Edytowano:

Weź znak po znaku, dodaj go do bajtu wyniku i pomnóż przez 2, aby przekonwertować z binarnego na dziesiętny (z wyjątkiem ostatniego znaku, należy go po prostu dodać).

Następnie zwróć byte jako char.

public static char someFunc(string bs) { 
    byte result = 0;
    for (int i = 0; i < bs.Length - 1; i++)
    {
        if (bs[i].Equals('1')) 
        {
            result += 1;
        }
        result *= 2;
    }
    if (bs[bs.Length - 1].Equals('1')) 
    {
        result++;
    }
    return (char) result;
}

Zwraca J dla "01001010"

0
Сергей Б. 21 czerwiec 2021, 07:16

Cześć, to jest jedna implementacja, której używam w java, ale będzie to również działać dla c#. Bądź mój, potrzebujesz zmian składni.

static int someFunc(String s){
    int binary = 0x00;
    for(int i=0;i<8;i++){
        if(s.charAt(i) == '1')
            binary =(binary<<1) | 0x01;
        else if(s.charAt(i) == '0')
            binary =(binary<<1) | 0x00;

    }
    return binary;
}
-1
Abhishek Babhulkar 21 czerwiec 2021, 06:52