2013-02-21 16 views
6

Mam byte [] srno w moim kodzieprzekonwertować cały bajt [] na uint

byte[] srno = new byte[6]; 

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

teraz chcę tę wartość w uint jak

uint a = 0xff0f2412160a; 

Jak go przekonwertować?

+3

'uint' wynosi 4 bajty, ale masz 6 bajty tam. W każdym razie, czy znasz klasę BitConverter? – Ani

+0

Po prostu zrób matematykę: 'srno [0] * 0x10000000000 + srn0 [1] * 0x100000000 ...'. Lub cokolwiek. –

+0

@Ani: ok nie ma problemu, powiedz mi o ulongu? Klasa BitConverter potrzebuje indeksu Nie chcę dla indeksu pertikularnego Chcę przekonwertować całą tablicę – Kevan

Odpowiedz

8

Zgodnie z zasugerowaną @animaonline, powinieneś użyć BitConverter do konwersji tablicy bajtów na uint lub * ulong. W ten sposób masz 6 bajtów, uint jest dla ciebie za mały. Powinieneś przekonwertować na ulong *. Ale konwerter wymaga ośmiu bajtów, więc stworzyć nową tablicę z wymaganej liczby bajtów:

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

To działa tak, jak chcę! – Kevan

0

W przestrzeni nazw System znajdziesz klasę BitConverter biblioteki. Chcesz statycznej ToUInt64() funkcję w następujący sposób:

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

Będziesz musiał dostosować rozmiar macierzy do [8]

MSDN

+1

Musisz najpierw odwrócić tablicę! –

0

każdy wydaje się być ignorowanie kodowanie bajt polecenia swojego oczekiwano wydajność. Klasa BitConverter używa stałego kodowania (zazwyczaj Little-Endian, IIRC). Zakłada się, że wyjście w przykładzie jest typu Big-Endian. W idealnym świecie wystarczyłaby sama matematyka, ale łatwiej jest użyć Array.Reverse, a następnie użyć wbudowanej klasy BitConverter.

są tam pewnie będzie kupa odpowiedzi zanim mogę pisać to tak tutaj jest naprawdę szybki kawałek kodu niebezpieczny:

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