用于存储长序列号的DataType(10个字节)

时间:2010-06-03 15:36:17

标签: c# .net types unsigned 128-bit

我们有一个具有10字节序列号的设备,必须将其读入我们的应用程序并存储为.net数据类型。在器件中,它存储为无符号10字节(80位)数。我不希望我们将对此数字执行任何数学运算,而只是将其显示给用户。

用于存储此数据类型的.NET框架doesn't have a built in UNIT128。我对存储此数据类型的建议是创建一个10个元素的字节数组,并将数据读入此数组。这个问题有更好的解决方案吗?

注意:我在this question中看到GUID是一个128字节的有符号整数,但以这种方式使用GUID似乎是一个坏主意。还有其他建议吗?

5 个答案:

答案 0 :(得分:4)

您应该使用字节数组。

答案 1 :(得分:1)

如果您只是显示它,为什么不使用字符串?如果您需要额外的安全性来防止意外更改,您甚至可以将其包装到某个业务对象中。

答案 2 :(得分:1)

我同意@SLaks,你应该使用一个字节数组。但是,BigInteger http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx也可能有效,因为它理论上没有下限/上限。这仅适用于.NET 4。字节数组仍然是更好的选择。

答案 3 :(得分:0)

如果您没有对数字进行计算,那么System.String有什么问题?

答案 4 :(得分:0)

你几乎没有选择。它们取决于您将如何使用数据。您可以将其打包到Guid中,使用字节数组,使用自定义Struct,或将其打包为Base64或HEX并将其填充到字符串中。

[StructLayout( LayoutKind.Explicit)]
public struct MyStruct
{
    public MyStruct(byte[] buffer)
    {
        if (buffer.Length != 10)
            throw new ArgumentOutOfRangeException();
        High = BitConverter.ToUInt16(buffer, 0);
        Low = BitConverter.ToUInt64(buffer, 2);
    }
    [FieldOffset(0)]
    public ushort High;  //2 bytes
    [FieldOffset(2)]
    public ulong Low;    //8 bytes

    public byte[] Bytes
    {
        get
        {
            return BitConverter.GetBytes(High)
                .Concat(BitConverter.GetBytes(Low))
                .ToArray();
        }
    }
    public override string ToString()
    {
        return Convert.ToBase64String(Bytes);
    }
    public static MyStruct Parse(string toParse)
    {
        var bytes = Convert.FromBase64String(toParse);
        return new MyStruct(bytes);
    }
}