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?

Другие вопросы по тегам