C# - 如何将10个字节转换为无符号长整数

时间:2010-05-13 23:47:26

标签: c#

我有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);
        }

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

2 个答案:

答案 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,这就是很多烦人的演员和圆括号。)