2013-02-21 27 views
6

Tôi đã byte [] srno trong mã của tôichuyển đổi toàn bộ byte [] vào uint

byte[] srno = new byte[6]; 

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

bây giờ tôi muốn giá trị này trong uint như

uint a = 0xff0f2412160a; 

Làm thế nào để chuyển đổi nó?

+3

A 'uint' là 4 byte, nhưng bạn đã có 6 byte ở đó. Trong mọi trường hợp, bạn có biết lớp 'BitConverter' không? – Ani

+0

Chỉ cần thực hiện phép tính: 'srno [0] * 0x10000000000 + srn0 [1] * 0x100000000 ...'. Hay bất cứ cái gì. –

+0

@Ani: ok không có vấn đề cho tôi biết về ulong? lớp BitConverter cần index Tôi không muốn cho chỉ số perticular Tôi muốn chuyển đổi toàn bộ mảng – Kevan

Trả lời

8

Như @animaonline đề xuất, bạn nên sử dụng BitConverter để chuyển mảng byte thành uint hoặc * ulong. Vì vậy, bạn có 6 byte, uint quá nhỏ đối với bạn. Bạn nên chuyển thành ulong *. Nhưng bộ chuyển đổi yêu cầu tám byte, do đó, tạo mảng mới với số byte yêu cầu:

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

Điều này hoạt động như tôi mong muốn! – Kevan

0

Trong không gian tên hệ thống, bạn sẽ tìm thấy lớp thư viện BitConverter. Bạn muốn tĩnh ToUInt64() chức năng như sau:

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

Bạn sẽ cần phải điều chỉnh kích thước của mảng của bạn để [8]

MSDN

+1

u cần phải đảo ngược mảng đầu tiên! –

0

Mọi người dường như bị bỏ qua mã hóa byte theo đơn đặt hàng của dự kiến ​​của mình đầu ra. Lớp BitConverter sử dụng mã hóa cố định (thường là Little-Endian, IIRC). Đầu ra trong ví dụ này được giả định là Big-Endian. Trong một thế giới hoàn hảo bạn muốn chỉ cần làm toán chính mình, nhưng đó là đơn giản để sử dụng Array.Reverse sau đó sử dụng BitConverter lớp sẵn có.

Có lẽ sẽ là một đống câu trả lời trước khi tôi nhận được để đăng bài này vì vậy đây là một mảnh thực sự nhanh chóng mã không an toàn:

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; 
} 
Các vấn đề liên quan