2008-09-23 6 views
5

Was ist der beste Weg, um eine 32-Bit-Integer in vier (unsigned) Zeichen in C# zu teilen.Konvertierung von 32-Bit-Ganzzahl in 4 Zeichen

+0

Was Sie die Zeichen erwartet sein? ASCII-Interpretation der Bytes? –

+0

Meinst du Zeichen oder Bytes? Zeichen sind einzelne Zeichen des Textes in einer gegebenen Kodierung, die mehreren Bytes entsprechen können - wahrscheinlich nicht, was Sie wollen. –

Antwort

7

Quick'n'Dirty:

int value = 0x48454C4F; 
Console.WriteLine(Encoding.ASCII.GetString(
    BitConverter.GetBytes(value).Reverse().ToArray() 
)); 

Konvertieren des int Bytes, die Byte-Array für die korrekte Reihenfolge umgekehrt wird und dann die Darstellung ASCII-Zeichen von ihm zu bekommen.

EDIT: die Reverse-Methode ist eine Erweiterungsmethode von .NET 3.5, nur für Informationen. Das Umkehren der Byte-Reihenfolge ist in Ihrem Szenario möglicherweise ebenfalls nicht erforderlich.

Prost, David

+0

Ist das ultimative Ziel, nur um sie auf der Konsole zu drucken? Wenn nicht, hat diese Methode viel unnötigen Overhead, verglichen mit den Vorschlägen von Jason und Sam. – Kip

+0

@Kip: Dies ist ein portabler Weg, um die Bytes für mehr als nur ganze Zahlen zu bekommen.Die Anfrage ist jedoch zunächst ziemlich seltsam - warum sollten Sie versuchen, eine ganze Zahl als Zeichen zu codieren - es sei denn, er wollte wirklich Bytes sagen? –

+0

@Kip: Wie schon erwähnt, war dies eine schnelle und dreckige Antwort. Console.WriteLine war nur für mich etwas Ausgang und Beweis, dass es funktioniert. Der interessante Teil ist die Methoden, um das Ziel zu erreichen. – VVS

4

Es ist nicht klar, ob dies wirklich das, was Sie wollen, aber:

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); 

Dies vorausgesetzt, dass Sie das Bytes als unterste Reihe von Unicode-Zeichen interpretiert werden sollen.

0

Sie die 8-Byte-Blöcke erhalten:

int a = i & 255; // bin 11111111 
int b = i & 65280; // bin 1111111100000000 

Sie die ersten drei Bytes nach unten in ein einziges Byte brechen, so dass sie nur durch die richtige Nummer teilen und andere logische ausführen und Ihre letzte Byte zu bekommen.

Edit: Jasons Lösung mit den Bitshift ist natürlich viel schöner.

5

Char? Vielleicht suchen Sie diese handliche kleine Helferfunktion?

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

BitConverter

0

.net verwendet Unicode, ein char ist 2 Byte nicht 1

Um zwischen Binärdaten zu umwandeln Nicht-Unicode-Text, der die Klasse verwenden System.Text.Encoding enthält .

Wenn Sie möchten, tun 4 Bytes und nicht die Zeichen dann ersetzen Sie das Zeichen mit dem Byte in Jasons Antwort

+0

Nur zur Klarstellung: .net verwendet Unicode-codiert als UCS-2 (ergo die 2 Bytes). – tzot

4

Ich habe es ein paar Möglichkeiten ausprobiert und fuhr die Zeit 1000000 Ints konvertieren genommen.

Einbau-convert-Methode, 325000 Zecken:

Encoding.ASCII.GetChars(BitConverter.GetBytes(x)); 

Pointer-Konvertierung, 100000 Zecken:

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 Zecken:

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; 
}