DataType для хранения длинного серийного номера (10 байт)
У нас есть устройство, имеющее 10-байтовый серийный номер, который должен быть считан в наше приложение и сохранен в тип данных.net. В устройстве он хранится в виде 10-разрядного (80-разрядного) числа без знака. Я не ожидаю, что мы будем выполнять какие-либо математические операции с этим числом, а только отображать его пользователю.
.NET Framework не имеет встроенного UNIT128 для хранения этого типа данных. Мое предложение по сохранению этого типа данных - создать байтовый массив из 10 элементов и прочитать данные в этот массив. Есть ли лучшие решения этой проблемы?
Примечание. В этом вопросе я видел, что GUID - это целое число со 128-байтовым знаком, но кажется плохой идеей использовать GUID таким образом. Любые другие предложения?
5 ответов
Если вы только отображаете его, почему бы не использовать строку? Если вам нужна дополнительная защита от случайных изменений, вы можете даже обернуть это в некоторый бизнес-объект.
Я согласен с @SLaks, вы должны использовать байтовый массив. Однако BigInteger, http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx, также может работать, поскольку теоретически он не имеет нижних / верхних границ. Это только для.NET 4. Массив байтов все равно будет лучшим выбором.
У вас есть несколько вариантов. Любые они зависят от того, как вы будете использовать данные. Вы можете упаковать его в 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);
}
}
Если вы не выполняете вычисления для числа, что не так с System.String?