Domanda

Abbiamo un dispositivo che ha un numero di serie a 10 byte, che deve essere letto nella nostra applicazione e memorizzato in un tipo di dati .net. Nel dispositivo è memorizzato come un numero senza segno 10 byte (80 bit). Non mi aspetto che saremo di eseguire qualsiasi operazioni matematiche su questo numero, ma solo la visualizzazione all'utente.

Il framework .NET non dispone di un costruito in UNIT128 per memorizzare questo tipo di dati. Il mio suggerimento per memorizzare questo tipo di dati è quello di creare una matrice di byte 10 elemento e leggere i dati in questa matrice. Ci sono delle soluzioni migliori a questo problema?

Nota: ho visto in questa domanda che un GUID è un numero intero con segno a 128 byte, ma sembra una cattiva idea di utilizzare un GUID in questo modo. Altri suggerimenti?

È stato utile?

Soluzione

Si dovrebbe usare un array di byte.

Altri suggerimenti

Se sei solo la visualizzazione di esso, perché non utilizzare una stringa? Se si desidera una maggiore sicurezza contro le modifiche accidentali, si potrebbe anche avvolgere che in qualche oggetto di business.

Sono d'accordo con @SLaks, è necessario utilizzare un array di byte. Tuttavia, BigInteger, http://msdn.microsoft.com/ it-it / library / system.numerics.biginteger.aspx , potrebbe anche funzionare, dal momento che ha teoricamente limiti inferiori / superiori. Questo è per .NET 4 soltanto. Array di byte sarebbe ancora una scelta migliore però.

Se non stai facendo i calcoli sul numero, ciò che non va con System.String?

Hai alcune opzioni. Qualsiasi essi dipendono da come si intende utilizzare i dati. Si può confezionare in un GUID, utilizzare un array di byte, utilizzare una struttura personalizzata o imballare come Base64 o HEX e roba del genere in una stringa.

[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);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top