Conversion d'un mots decimal 32 bits en 2 mots 16 bits

Résolu
ptitnico22 Messages postés 8 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 18 septembre 2008 - 17 sept. 2008 à 17:36
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre 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
A voir également:

12 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
17 sept. 2008 à 20:20
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 #   
3
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
17 sept. 2008 à 21:22
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)
1
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
18 sept. 2008 à 03:20
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)
1
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
17 sept. 2008 à 18:00
Ca devrait je pense, quelque chose comme :

mot16_1 = mot32 \ 32768
mot16_2 = mot32 MOD 32768

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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
17 sept. 2008 à 19:54
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));

}
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
17 sept. 2008 à 20:24
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
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
17 sept. 2008 à 21:34
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 ;-)
0
ptitnico22 Messages postés 8 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 18 septembre 2008
18 sept. 2008 à 00:26
Merci de toute vos réponses je vous direz demain se qu'il en est.
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
18 sept. 2008 à 09:36
Pour la culture
http://fr.wikipedia.org/wiki/Big_endian
x86 --> little endian
IBM/Motorola/... --> big endian
0
ptitnico22 Messages postés 8 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 18 septembre 2008
18 sept. 2008 à 16:00
Donc les méthodes de  Kevin.Ory 
et de casy s'intègres parfaitement.
Merci de votre aide.
A bientôt
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
18 sept. 2008 à 18:44
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))
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
18 sept. 2008 à 18:49
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
0
Rejoignez-nous