我们有一个具有10个字节序列号的设备,必须将其读取到我们的应用程序中并存储到.NET数据类型中。在设备中,它被存储为无符号的10字节(80位)编号。我不希望我们会在此数字上执行任何数学操作,而只会向用户显示。

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

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

有帮助吗?

解决方案

您应该使用字节数组。

其他提示

如果您只显示它,为什么不使用字符串?如果您希望在意外更改中进行额外的安全性,甚至可以将其包裹在某些业务对象中。

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

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

您几乎没有选择。他们取决于您将如何使用数据。您可以将其包装到GUID中,使用字节阵列,使用自定义结构,或将其作为base64或十六进制包装,然后将其塞入字符串中。

[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);
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top