代码之家  ›  专栏  ›  技术社区  ›  CrimsonX

用于存储长序列号(10字节)的数据类型

  •  0
  • CrimsonX  · 技术社区  · 15 年前

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

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

    this question GUID是128字节有符号整数,但以这种方式使用GUID似乎是个坏主意。还有其他建议吗?

    5 回复  |  直到 8 年前
        1
  •  4
  •   SLaks    15 年前

    应该使用字节数组。

        2
  •  1
  •   AllenG    15 年前

        3
  •  1
  •   Jeff Schumacher    15 年前

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

        4
  •  0
  •   pblasucci    15 年前

    如果你不计算这个数字,System.String有什么问题?

        5
  •  0
  •   Matthew Whited    15 年前

    [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);
        }
    }
    
    推荐文章