Jaki jest najlepszy sposób na podzielenie 32-bitowej liczby całkowitej na cztery (niepodpisane) znaki w języku C#.Konwersja z 32-bitowej liczby całkowitej na 4 znaki
Odpowiedz
Quick'n'dirty:
int value = 0x48454C4F;
Console.WriteLine(Encoding.ASCII.GetString(
BitConverter.GetBytes(value).Reverse().ToArray()
));
Konwersja int na bajty, odwrócenie bajt tablicę dla właściwej kolejności, a następnie uzyskanie reprezentacji znaków ASCII od niego.
EDYCJA: Metoda odwrotna jest metodą rozszerzenia z .NET 3.5, tylko dla informacji. Odwrócenie kolejności bajtów może również nie być potrzebne w twoim scenariuszu.
Pozdrawiam, David
Czy ostatecznym celem jest wydrukowanie ich na konsoli? Jeśli nie, ta metoda ma wiele niepotrzebnych kosztów ogólnych, w porównaniu do sugestii Jasona i Sama. – Kip
@Kip: Jest to bardziej przenośny sposób, aby uzyskać bajty na więcej niż tylko liczby całkowite.Żądanie jest raczej dziwne - dlaczego chciałbyś zakodować liczbę całkowitą jako znaki - chyba że naprawdę chciał powiedzieć bajty? –
@Kip: Jak wspomniano wcześniej, była to szybka i brudna odpowiedź. Console.WriteLine była po prostu dla mnie, aby uzyskać pewne dane wyjściowe i dowód, że działa. Ciekawą częścią są metody użyte do osiągnięcia celu. – VVS
Nie jest jasne, czy to jest naprawdę to, co chcesz, ale:
int x = yourNumber();
char a = (char)(x & 0xff);
char b = (char)((x >> 8) & 0xff);
char c = (char)((x >> 16) & 0xff);
char d = (char)((x >> 24) & 0xff);
zakłada to chcesz bajty interpretowane jako najniższego zakresu znaków Unicode.
dostaniesz 8-bajtowych bloków:
int a = i & 255; // bin 11111111
int b = i & 65280; // bin 1111111100000000
łamią pierwsze trzy bajty w dół w jeden bajt, po prostu podzielić je przez odpowiednie liczby i wykonać kolejny logiczny i uzyskać ostateczną bajt.
Edytuj: Rozwiązanie Jason'a z bitshiftami jest oczywiście o wiele ładniejsze.
Char? Może szukasz tej poręcznej funkcji małego pomocnika?
Byte[] b = BitConverter.GetBytes(i);
Char c = (Char)b[0];
[...]
BitConverter
.net używa Unicode, char jest 2 nie bajty 1
do konwersji danych binarnych zawierających tekst non-unicode użyć klasy System.Text.Encoding .
Jeśli nie chcesz 4 bajty, a nie znaków następnie zastąpić char bajt w odpowiedzi Jasona
Dla jasności: .net używa Unicode zakodowanego jako UCS-2 (ergo 2 bajty). – tzot
Próbowałem to kilka sposobów i taktowany czas potrzebny na konwersję 1000000 ints.
Wbudowana metoda konwersji, 325000 kleszcze:
Encoding.ASCII.GetChars(BitConverter.GetBytes(x));
wskaźnik konwersji, 100000 kleszcze:
static unsafe char[] ToChars(int x)
{
byte* p = (byte*)&x)
char[] chars = new char[4];
chars[0] = (char)*p++;
chars[1] = (char)*p++;
chars[2] = (char)*p++;
chars[3] = (char)*p;
return chars;
}
Bitshifting, 77000 kleszcze:
public static char[] ToCharsBitShift(int x)
{
char[] chars = new char[4];
chars[0] = (char)(x & 0xFF);
chars[1] = (char)(x >> 8 & 0xFF);
chars[2] = (char)(x >> 16 & 0xFF);
chars[3] = (char)(x >> 24 & 0xFF);
return chars;
}
Czego można oczekiwać na znaki być? Interpretacja bajtów ASCII? –
Masz na myśli znaki lub bajty? Znaki to pojedyncze znaki tekstu w danym kodowaniu, które mogą odpowiadać wielu bajtom - prawdopodobnie nie to, co chcesz. –