0

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

.NET 框架没有内置的 UNIT128来存储此数据类型。我对存储此数据类型的建议是创建一个 10 元素字节数组并将数据读入此数组。这个问题有更好的解决方案吗?

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

4

5 回答 5

4

您应该使用字节数组。

于 2010-06-03T15:37:20.780 回答
1

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

于 2010-06-03T15:38:46.453 回答
1

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

于 2010-06-03T15:51:33.990 回答
0

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

于 2010-06-03T15:38:05.817 回答
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);
    }
}
于 2010-06-03T15:47:06.460 回答