DataType для хранения длинного серийного номера (10 байтов)

StackOverflow https://stackoverflow.com/questions/2967464

Вопрос

У нас есть устройство, которое имеет серийный номер 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);
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top