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