2013-02-21 11 views
6

Ich habe byte [] srno in meinem Codekonvertieren ganze byte [] in uint

byte[] srno = new byte[6]; 

srno[0] = 0xff; 
srno[1] = 0x0f; 
srno[2] = 0x24; 
srno[3] = 0x12; 
srno[4] = 0x16; 
srno[5] = 0x0a; 

ich jetzt diesen Wert in uint wie

wollen es
uint a = 0xff0f2412160a; 

Wie konvertiert?

+3

A 'uint' ist 4 Bytes, aber du hast 6 bekommst Bytes dort. Kennt ihr auf jeden Fall die Klasse "BitConverter"? – Ani

+0

Rechnen Sie einfach: 'srno [0] * 0x10000000000 + srn0 [1] * 0x100000000 ...'. Oder Wasauchimmer. –

+0

@Ani: ok kein Problem, sag mir für ulong? BitConverter Klasse brauchen Index Ich will nicht für perticular Index Ich möchte ganze Array konvertieren – Kevan

Antwort

8

Wie @animaonline vorgeschlagen, sollten Sie BitConverter verwenden, um Byte-Array in Uint oder * ulong zu konvertieren. So haben Sie 6 Bytes, Uint ist zu klein für Sie. Sie sollten zu ulong * konvertieren. Aber Konverter erfordert acht Bytes, so erstellen Sie neue Array mit der erforderlichen Anzahl von Bytes:

byte[] value = new byte[8]; 
Array.Reverse(srno); // otherwise you will have a1612240fff result 
Array.Copy(srno, value, 6); 
ulong result = BitConverter.ToUInt64(value, 0); 
Console.WriteLine("{0:x}", result); // ff0f2412160a 
+1

Das funktioniert so, wie ich es wollte! – Kevan

0

Im System-Namespace finden Sie die BitConverter Bibliotheksklasse. Sie möchten die statische ToUInt64() Funktion wie folgt:

var a = BitConvert.ToUInt64(srno, 0); 

Sie müssen die Größe des Arrays zu [8]

MSDN

+1

Sie müssen zuerst das Array umkehren! –

0

Jeder einzustellen scheint die Byte-Reihenfolge Codierung ignoriert werden seine erwartete Ausgabe. Die Klasse BitConverter verwendet eine feste Codierung (normalerweise Little-Endian, IIRC). Die Ausgabe im Beispiel wird als Big-Endian angenommen. In einer perfekten Welt würden Sie nur die Mathematik selbst machen, aber es ist einfacher zu verwenden Array.Reverse dann verwenden Sie die eingebaute BitConverter Klasse.

Es ist wahrscheinlich ein Haufen Antwort sein, bevor ich diese so um eine Nachricht schreiben zu bekommen ist ein wirklich schnelles Stück unsicheren Code:

public static unsafe ulong ToULong(byte[] values) 
{ 
    byte* buffer = stackalloc byte[8]; 
    if (BitConverter.IsLittleEndian) 
     Array.Reverse(values); 
    System.Runtime.InteropServices.Marshal.Copy(values, 0, (IntPtr)buffer, values.Length); 
    return *(ulong*)buffer; 
}