我有10个字节 - 低位4个字节,高位4个字节,最高2个字节 - 我需要转换为无符号长整数。我尝试了几种不同的方法,但它们都不起作用:
尝试#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);
}
任何帮助将不胜感激,谢谢!
答案 0 :(得分: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;
我实际上没有测试过这个,但我认为它会起作用......
答案 1 :(得分: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
,这就是很多烦人的演员和圆括号。)