2008-09-23 10 views
5

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

+0

Czego można oczekiwać na znaki być? Interpretacja bajtów ASCII? –

+0

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. –

Odpowiedz

7

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

+0

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

+0

@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? –

+0

@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

4

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.

0

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.

5

Char? Może szukasz tej poręcznej funkcji małego pomocnika?

Byte[] b = BitConverter.GetBytes(i); 
Char c = (Char)b[0]; 
[...] 
0

.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

+0

Dla jasności: .net używa Unicode zakodowanego jako UCS-2 (ergo 2 bajty). – tzot

4

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; 
} 
Powiązane problemy