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

Signaler
Messages postés
8
Date d'inscription
lundi 27 mars 2006
Statut
Membre
Dernière intervention
18 septembre 2008
-
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
-
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

12 réponses

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
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 #   
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
9
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)
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
9
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)
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Ca devrait je pense, quelque chose comme :

mot16_1 = mot32 \ 32768
mot16_2 = mot32 MOD 32768

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
30
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));

}
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
30
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
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
30
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 ;-)
Messages postés
8
Date d'inscription
lundi 27 mars 2006
Statut
Membre
Dernière intervention
18 septembre 2008

Merci de toute vos réponses je vous direz demain se qu'il en est.
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
30
Pour la culture
http://fr.wikipedia.org/wiki/Big_endian
x86 --> little endian
IBM/Motorola/... --> big endian
Messages postés
8
Date d'inscription
lundi 27 mars 2006
Statut
Membre
Dernière intervention
18 septembre 2008

Donc les méthodes de  Kevin.Ory 
et de casy s'intègres parfaitement.
Merci de votre aide.
A bientôt
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
9
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))
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
9
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