DataType для хранения длинного серийного номера (10 байт) - PullRequest
0 голосов
/ 03 июня 2010

У нас есть устройство, имеющее 10-байтовый серийный номер, который должен быть считан в наше приложение и сохранен в тип данных .net. В устройстве оно хранится в виде 10-разрядного (80-разрядного) числа без знака. Я не ожидаю, что мы будем выполнять какие-либо математические операции с этим числом, а только отображать его пользователю.

.NET Framework не имеет встроенного UNIT128 для хранения этого типа данных. Мое предложение для сохранения этого типа данных состоит в том, чтобы создать массив байтов из 10 элементов и прочитать данные в этот массив. Есть ли лучшие решения этой проблемы?

Примечание: я видел в этот вопрос , что GUID представляет собой целое число со знаком 128 байтов, но использование GUID таким способом кажется плохой идеей. Любые другие предложения?

Ответы [ 5 ]

4 голосов
/ 03 июня 2010

Вы должны использовать байтовый массив.

1 голос
/ 03 июня 2010

Я согласен с @SLaks, вы должны использовать байтовый массив. Тем не менее, BigInteger, http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx, также может работать, так как теоретически не имеет нижних / верхних границ. Это только для .NET 4. Массив байтов все равно будет лучшим выбором.

1 голос
/ 03 июня 2010

Если вы только отображаете его, почему бы не использовать строку? Если вам нужна дополнительная защита от случайных изменений, вы можете даже обернуть это в некоторый бизнес-объект.

0 голосов
/ 03 июня 2010

У вас есть несколько вариантов. Любые они зависят от того, как вы будете использовать данные. Вы можете упаковать его в 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);
    }
}
0 голосов
/ 03 июня 2010

Если вы не выполняете вычисления для числа, что не так с System.String?

...