Conversion d'un mots decimal 32 bits en 2 mots 16 bits [Résolu]

Messages postés
8
Date d'inscription
lundi 27 mars 2006
Dernière intervention
18 septembre 2008
- - Dernière réponse : Kevin.Ory
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Dernière intervention
7 janvier 2009
- 18 sept. 2008 à 18:49
Bonjours,

Voila je voudrais pouvoir transformer le mot décimal  32 bits deux mots de 16 bits le tout sur Visual Basic 2005

par ex : le mot 16809983 en 32 bits se transforme en 256 et 32767 en 16 bits

Si vous pouvez me dire comment procéder etc ...

Merci d'avance
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
3
Merci
Tiens, je constate que mon code est faux.

C'est 65536 le diviseur et non pas 32768

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de cs_casy
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Dernière intervention
7 janvier 2009
3
Merci
Salut,
nhervagault, il existe déjà une classe permettant la conversion entre les type de base et des tableaux de bytes dans le framework

' L'integer (entier 32 bits) :
Dim IntegerValue As Integer = 34
Dim tab() As Byte = BitConverter.GetBytes(IntegerValue)
' Les 2 short (entier 16 bits) :
Dim ShortValue1 As Short = BitConverter.ToInt16(tab, 0)
Dim ShortValue2 As Short = BitConverter.ToInt16(tab, 3)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de Kevin.Ory
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Dernière intervention
7 janvier 2009
3
Merci
Little ou big endian, je connais pas

Mais je viens de voir que j'avais fais une erreur:
Dim ShortValue2 As Short = BitConverter.ToInt16(tab, <strike>3</strike>)
devient:
Dim ShortValue2 As Short = BitConverter.ToInt16(tab, 2)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de Kevin.Ory
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
0
Merci
Ca devrait je pense, quelque chose comme :

mot16_1 = mot32 \ 32768
mot16_2 = mot32 MOD 32768

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
Commenter la réponse de cs_casy
Messages postés
6069
Date d'inscription
dimanche 13 avril 2003
Dernière intervention
15 juillet 2011
0
Merci
Salut

Avec les 2 methodes suivantes c'est surement possible

public static byte[] UInt32ToBytes(UInt32 pNumber)
{
byte[] res = new byte[4];
res[0] = (byte)(pNumber >> 24);
res[1] = (byte)((pNumber << 8) >> 24);
res[2] = (byte)((pNumber << 16) >> 24);
res[3] = (byte)((pNumber << 24) >> 24);
return res;
}

publicstaticshort MakeWord(byte bLow, byte bHigh)
{
      return (short)(bLow | (bHigh << 8));

}
Commenter la réponse de nhervagault
Messages postés
6069
Date d'inscription
dimanche 13 avril 2003
Dernière intervention
15 juillet 2011
0
Merci
Oups,

J'ai mis le code en c# en voici un en vb.net (à partir de 2005) pour l'autre fonction je te laisse traduire ;-)

Public Shared Function MakeWord(ByVal
bLow As Byte, ByVal bHigh As Byte) As Short

     
Return Convert.ToInt16(bLow Or (bHigh << 8))

End Function
Commenter la réponse de nhervagault
Messages postés
6069
Date d'inscription
dimanche 13 avril 2003
Dernière intervention
15 juillet 2011
0
Merci
Oui,

Mais avec cette classe, il faut faire attention comme avec ma méthode.
 J'ai oublié de le préciser, si on travaille en little endian ou en big endian (ca dépend sur quelle plateforme de travail ;-)
ma méthode fonction avec l'une des plateforme et bitconverter avec l'autre.

Je l'avais oubliée cette classe ;-)

De plus pour le  bitconverter, la longeur d'entrée me semble infini contrairement à ma méthode.

Voila, maintenant il suffit de trier pour prendre la méthode qui convient ;-)
Commenter la réponse de nhervagault
Messages postés
8
Date d'inscription
lundi 27 mars 2006
Dernière intervention
18 septembre 2008
0
Merci
Merci de toute vos réponses je vous direz demain se qu'il en est.
Commenter la réponse de ptitnico22
Messages postés
6069
Date d'inscription
dimanche 13 avril 2003
Dernière intervention
15 juillet 2011
0
Merci
Pour la culture
http://fr.wikipedia.org/wiki/Big_endian
x86 --> little endian
IBM/Motorola/... --> big endian
Commenter la réponse de nhervagault
Messages postés
8
Date d'inscription
lundi 27 mars 2006
Dernière intervention
18 septembre 2008
0
Merci
Donc les méthodes de  Kevin.Ory 
et de casy s'intègres parfaitement.
Merci de votre aide.
A bientôt
Commenter la réponse de ptitnico22
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Dernière intervention
7 janvier 2009
0
Merci
Ah oui, octets de poids faible et de poids fort inversé, bon à savoir effectivement. Merci pour l'info

Mais sinon, la méthode de casy reste la plus simple :

   Dim Int32 As Int32 = 123
   Dim Int16a As Int16
   Dim Int16b As Int16 = Math.DivRem(int32, 65536, CInt(Int16a))
Commenter la réponse de Kevin.Ory
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Dernière intervention
7 janvier 2009
0
Merci
Ah ben non, fonctionne pas avec mon CInt()

Faut faire un truc comme ça, car Math.DivRem n'accepte pas les Short:

  Dim Int32 As Int32 = 4213654
  Dim Reste As Int32
  Dim Int16a As Int16 = Math.DivRem(Int32, 65536, Reste)
  Dim Int16b = Reste
Commenter la réponse de Kevin.Ory

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.