2013-02-21 69 views
6

我已经在我的代码的byte [] srno转换整个字节[]到UINT

byte[] srno = new byte[6]; 

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

现在我要像

uint a = 0xff0f2412160a; 

如何转换在UINT这个价值?

+3

一个'uint'为4个字节,但你6字节在那里。无论如何,你知道'BitConverter'类吗? – Ani 2013-02-21 12:19:40

+0

只要做数学运算:'srno [0] * 0x10000000000 + srn0 [1] * 0x100000000 ...'。管他呢。 – 2013-02-21 12:19:55

+0

@Ani:好的没问题告诉我ulong? BitConverter类需要索引我不想为特定索引我想转换整个数组 – Kevan 2013-02-21 12:21:04

回答

8

正如@animaonline建议的那样,您应该使用BitConverter将字节数组转换为uint或* ulong。因此你有6个字节,uint对你来说太小了。你应该转换为ulong *。但转换器需要八个字节,因此与所需的字节数创建新的数组:

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

这工作正如我所愿! – Kevan 2013-02-21 12:40:17

0

在System命名空间中,你会发现BitConverter库类。你想静态ToUInt64()功能如下:

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

您需要将您的数组的大小调整到[8]

MSDN

+1

你需要先倒置数组! – 2013-02-21 12:34:16

0

大家似乎忽略了他所期望的字节顺序编码输出。 BitConverter类使用固定编码(通常是Little-Endian,IIRC)。示例中的输出假定为Big-Endian。在一个完美的世界中,你只需要自己做数学,但使用Array.Reverse然后使用内置的BitConverter类更简单。

有可能将是答案一堆之前,我张贴此所以这里是一个非常快的一段不安全代码:

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