2010-06-03 5 views
0

Nous avons un périphérique qui a un numéro de série de 10 octets qui doit être lu dans notre application et stocké dans un type de données .net. Dans l'appareil, il est enregistré 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 numéro, mais seulement l'afficher à l'utilisateur.DataType pour stocker un numéro de série long (10 octets)

Le framework .NET doesn't have a built in UNIT128 pour stocker ce type de données. Ma suggestion pour stocker ce type de données est de créer un tableau de 10 éléments et de lire les données dans ce tableau. Y a-t-il de meilleures solutions à ce problème?

Remarque: J'ai vu dans this question qu'un GUID est un entier signé de 128 octets, mais cela semble être une mauvaise idée d'utiliser un GUID de cette manière. D'autres suggestions?

+0

Les byes sont-ils complètement arbitraires? – SLaks

+0

@SLaks, oui je crois que les octets sont arbitraires (il faudrait vérifier avec le concepteur du numéro de série, et je ne sais pas qui c'est) – CrimsonX

+0

Est-ce que vous affichez les octets bruts en hexadécimal, leur représentation entière, ou quoi? ? – SLaks

Répondre

4

Vous devez utiliser un tableau d'octets.

+0

Heureux d'apprendre que je suis sur la même page, je pense aussi que c'est l'option la plus simple. Merci pour le deuxième avis. – CrimsonX

0

Si vous ne faites pas de calculs sur le nombre, quel est le problème avec System.String?

1

Si vous ne faites que l'afficher, pourquoi ne pas utiliser une chaîne de caractères? Si vous souhaitez une sécurité supplémentaire contre les modifications accidentelles, vous pouvez même l'intégrer dans un objet métier.

+1

Parce que vous obtenez alors des problèmes d'encodage. – SLaks

+0

@SLacks: quels problèmes d'encodage? Je peux manquer quelque chose, mais si c'est seulement utilisé pour afficher à l'utilisateur comment est un problème d'encodage. Même en l'extrayant de la base de données, il y a un appel Cast() ou Convert() relativement simple. – AllenG

0

Vous avez peu d'options. Tout dépend de la façon dont vous utiliserez les données. Vous pouvez l'empaqueter dans un Guid, utiliser un tableau d'octets, utiliser un Struct personnalisé, ou l'empaqueter en Base64 ou en HEX et l'insérer 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); 
    } 
} 
+0

Le seul point de 'struct' est de le marier correctement. – SLaks

+0

C'est pourquoi cela dépend du pourquoi des données. Il n'y a rien de mal à utiliser une structure comme une union C si vous pouvez décoder les données d'entrée. Dis les données pourraient être décodées comme un code VIN. Vous pouvez utiliser l'empaquetage 'struct' byte pour superposer des enums et des drapeaux sur les parties correspondantes. –

+0

Il est également très possible que les 10 octets de données de l'appareil soient réellement le numéro de série codé en ASCII. Et si c'est le cas, il n'y a rien de mal à utiliser 'Encoding.ASCII.GetString (...)' –

1

Je suis d'accord avec @SLaks, vous devriez utiliser un tableau d'octets. Cependant, BigInteger, http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx, pourrait également fonctionner, car il n'a théoriquement pas de limite inférieure/supérieure. C'est pour .NET 4 seulement. Le tableau d'octets serait toujours un meilleur choix.

+0

Son bon à savoir ce type de données existe aussi. Merci pour l'info – CrimsonX

+0

Ceci est uniquement disponible dans .Net 4. – SLaks

+0

@SLaks - Bon point, j'ai oublié de le mentionner. –