用于存储长序列号的数据类型(10个字节)
题
我们有一个具有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);
}
}
不隶属于 StackOverflow