Question

Nous avons un dispositif qui a un numéro de série de 10 octets qui doit être lu dans notre application et stockée dans un type de .net. Dans le dispositif, il est stocké sous la forme d'un nombre non signé de 10 octets (80 bits). Je ne pense pas que nous allons effectuer des opérations mathématiques sur ce nombre, mais seulement l'afficher à l'utilisateur.

Le framework .NET ne dispose pas construit dans le UNIT128 pour stocker ce type de données. Ma suggestion pour le stockage de ce type de données est de créer un tableau d'octets de l'élément 10 et de lire les données dans ce tableau. Y a-t-il des meilleures solutions à ce problème?

Note: Je l'ai vu dans cette question qu'un GUID est un entier signé de 128 octets, mais il semble être une mauvaise idée d'utiliser un GUID de cette façon. D'autres suggestions?

Était-ce utile?

La solution

Vous devez utiliser un tableau d'octets.

Autres conseils

Si vous ne l'afficher, pourquoi ne pas utiliser une chaîne? Si vous voulez une sécurité supplémentaire contre les changements accidentels, vous pourriez même envelopper que dans un objet commercial.

Je suis d'accord avec @SLaks, vous devez utiliser un tableau d'octets. Cependant, BigInteger, http://msdn.microsoft.com/ fr-fr / bibliothèque / system.numerics.biginteger.aspx , pourrait aussi le travail, car il a théoriquement pas de limite inférieure / supérieure. Ceci est pour .NET 4 seulement. Tableau d'octets serait toujours un meilleur choix que.

Si vous n'êtes pas faire des calculs sur le nombre, ce qui ne va pas avec System.String?

Vous avez quelques options. Tout dépend de la façon dont ils vous utiliserez les données. Vous pouvez emballer dans un Guid, utilisez un tableau d'octets, utilisez une structure de commande, ou l'emballer en base64 ou HEX et le farcir dans une chaîne.

[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);
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top