2010-05-13 37 views
2

我有10个字节 - 4个字节的低阶,4个字节的高阶,2个字节的最高阶 - 我需要转换为无符号长。我已经尝试了几种不同的方法,但都没有工作:如何转换10个字节为无符号长

尝试#1:

var id = BitConverter.ToUInt64(buffer, 0); 

尝试#2:

var id = GetID(buffer, 0); 

long GetID(byte[] buffer, int startIndex) 
     { 
      var lowOrderUnitId = BitConverter.ToUInt32(buffer, startIndex); 
      var highOrderUnitId = BitConverter.ToUInt32(buffer, startIndex + 4); 
      var highestOrderUnitId = BitConverter.ToUInt16(buffer, startIndex + 8); 
      return lowOrderUnitId + (highOrderUnitId * 100000000) + (highestOrderUnitId * 10000000000000000); 
     } 

任何帮助,将不胜感激,谢谢!

+1

你从哪里得到一个10字节长? 10个字节是80位,不适合64位长。 – 2010-05-13 23:50:40

+0

我最后一次检查无符号长整型是64位宽。你期望得到什么?这些术语是你乘以最后一行应该是十六进制的吗? – 2010-05-13 23:51:00

+0

不长只有8个字节? – tbischel 2010-05-13 23:53:10

回答

2

如注释所示,10个字节不适合long(这是一个64位数据类型 - 8字节)。但是,你可以使用一个decimal(这是128位宽 - 16个字节):

var lowOrderUnitId = BitConverter.ToUInt32(buffer, startIndex); 
var highOrderUnitId = BitConverter.ToUInt32(buffer, startIndex + 4); 
var highestOrderUnitId = BitConverter.ToUInt16(buffer, startIndex + 8); 

decimal n = highestOrderUnitId; 
n *= UInt32.MaxValue; 
n += highOrderUnitId; 
n *= UInt32.MaxValue; 
n += lowOrderUnitId; 

我没有实际测试过这一点,但我认为它会工作...

+0

我认为你需要用'1m + UInt32.MaxValue'(两个地方)替换'UInt32.MaxValue'。 – 2013-02-23 18:13:34

0

由于一直上面提到的一个ulong不足以容纳10个字节的数据,它只有8个字节。您需要使用Decimal。最有效的方法(更不用提最少的代码),很可能会得到一个UInt64了它,再加入高序位:

ushort high = BitConverter.ToUInt16(buffer, 0); 
ulong low = BitConverter.ToUInt64(buffer, 2); 
decimal num = (decimal)high * ulong.MaxValue + high + low; 

(您需要添加high第二次,否则你需要乘以值ulong.MaxValue + 1,这是很多令人讨厌的铸造和括号。)

+0

也许可以用'decimal'类型的'1m'来完成。然后你的最后一行会显示:'decimal num = high *(ulong.MaxValue + 1m)+ low;' – 2013-02-23 18:15:30

相关问题