我们有一个具有10字节序列号的设备,必须将其读入我们的应用程序并存储为.net数据类型。在器件中,它存储为无符号10字节(80位)数。我不希望我们将对此数字执行任何数学运算,而只是将其显示给用户。
用于存储此数据类型的.NET框架doesn't have a built in UNIT128。我对存储此数据类型的建议是创建一个10个元素的字节数组,并将数据读入此数组。这个问题有更好的解决方案吗?
注意:我在this question中看到GUID是一个128字节的有符号整数,但以这种方式使用GUID似乎是一个坏主意。还有其他建议吗?
答案 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);
}
}