2014-09-01 2 views
-2

Je sais que la question est un peu étrange, je demande par pure curiosité, car je ne pouvais pas trouver d'informations pertinentes autour. Aussi, s'il vous plaît n'hésitez pas à modifier le titre, je sais que c'est terrible, mais ne pouvait pas mieux. Disons que j'ai une variable foo de type object, qui est soit short soit ushort. Je dois l'envoyer sur le réseau, donc j'utilise BitConverter pour la transformer en octet []:C# - les représentations d'octets de différents types sont-elles différentes?

byte[] b = new byte[2]; 
if(foo is short){ 
    BitConverter.GetBytes((short)foo, 0); 
}else{ 
    BitConverter.GetBytes((ushort)foo, 0); 
} 

Réseau/Socket magique arrive, je veux revenir ma variable. Je connais le type que je m'attends à obtenir, donc j'appelle BitConverter.GetUInt16 ou GetInt16 correctement. Maintenant, la question est - est-ce vraiment important, comment j'ai sérialisé la variable? Je veux dire, les bits sont les mêmes, donc ça ne devrait pas avoir de sens, ai-je raison? Alors que je pouvais

BitConverter.GetBytes((short)foo, 0); 

puis faire

BitConverter.GetUInt16(myByteArray, 0); 

Toute personne?

+2

Il y a seulement 65536 shorts. Essayez-les tous, et bientôt vous connaîtrez la réponse. –

+0

Est-ce que cela voudrait dire que pour les machines ayant la même endianness bytes _will_ sera la même chose? – Pindwin

+0

@CodeCaster ... quoi? – Rawling

Répondre

0

Pour sérialiser votre variable, vous devez affecter le résultat de BitConverter.GetBytes() à votre octet []. Peu importe si votre variable est courte ou ushort, car ceux-ci sont de la même taille et contiennent les mêmes valeurs entre 0 et 32767. Tant que la taille est correcte, vous ne devriez avoir aucun problème.

Ainsi, vous pouvez rendre votre code aussi simple que cela:

byte[] b; 
if(foo is short || foo is ushort) 
    b = BitConverter.GetBytes((short)foo); // You get proper results for ushort as well 

Cependant sur le site de décodage, vous devez savoir que vous tapez besoin, pour faire court, vous avez besoin:

short foo = BitConverter.ToInt16(b, 0); 

mais si vous avez besoin d'un ushort, vous écrivez:

ushort foo = BitConverter.ToUInt16(b, 0); 

Lorsque vous envoyez des variables multi-octets sur le réseau, vous Sh Assurez-vous également qu'ils sont dans l'ordre des octets du réseau comme @ itsme86 mentionné dans sa réponse.

Si vous devez envoyer des shorts et des shorts, vous devez également envoyer des informations de type à l'autre extrémité pour savoir si le type de données est signé ou non. Je n'écris pas à ce sujet maintenant en détail car cela compliquerait le code.

+0

C'est exactement ce que je demandais à propos de – Pindwin

+0

Short et ushort n'ont pas la même gamme.Essayez avec une valeur négative – CodeCaster

+0

Oui, ils ne le font pas, mais ils ont le s taille de ame, les valeurs comprises entre 0 et 32767 sont communes, et la conversion de ushort en short ne modifie pas la représentation, donc pour la sérialisation, elles peuvent être traitées de la même manière. –

0

Si vous le transmettez sur le réseau, vous pouvez rencontrer des problèmes endianness (c'est-à-dire que les valeurs multi-octets peuvent être stockées dans différents ordres d'octets sur différentes architectures). La convention standard lors de l'envoi d'une valeur multi-octets sur un réseau est de le transformer en Network Byte Order.

Le récepteur de la valeur multi-octets le convertirait ensuite en Host Byte Order.

+0

Merci. En supposant que l'endianness correspondant – Pindwin

Questions connexes