Integer to Bytes()

cs_yvesyves Messages postés 561 Date d'inscription samedi 10 janvier 2004 Statut Membre Dernière intervention 11 octobre 2010 - 11 févr. 2007 à 20:24
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 12 févr. 2007 à 10:01
Bonjour,
Je cherche une fonction simple permettant de convertir un entier non signé UShort ou UInt16 sous un tableau de bytes Byte. Je sais que celui-ci est codé sous 2 octets et j'aimerais les récuperer sous 2 valeurs de type Byte (dans un tableau).
Merci de votre réponse. (Je suis sous Vb.net mais j'accepte les réponses de VB6)

10 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
11 févr. 2007 à 21:32
Ni Ushort no Uint16 ne veulent dire quelque chose sous VB (et tu es sous le forum VB6..., pas C++)
Un entier non signé s'exprime sous VB en utilisant la fonction Abs
Si tu développes sous VB.Net, tu devrais interroger le forum concerné, en ce qui concerne la transposition, en tableau de bytes, de Abs(nombre), car la syntaxe y est peut-être différente.
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
11 févr. 2007 à 21:36
en VB6 ça donnerait ceci:
mais je doute que ça marche en .net

Private Type Srce
    n     As Integer
End Type

Private Type Dest
    b(1)  As Byte
End Type

Private Sub Command1_Click()
    Dim s1  As Srce
    Dim s2  As Dest
  
    s1.n = &HABCD
  
    LSet s2 = s1
    MsgBox Hex$(s2.b(1))   ' --> 98
    MsgBox Hex$(s2.b(0))   ' --> 76
  
End Sub

Daniel
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
11 févr. 2007 à 21:38
Juste un rappel : les nombres de type integer (sur 2 octets en 16 bits) ne sont pas les seuls entiers. Ceux de type long le sont aussi (sur 4 octets, en 32 bits)
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
11 févr. 2007 à 21:38
ah oui j'ai changé de donnée  &H9876
sinon faut passer par des calculs

Private Sub Command1_Click()
    Dim n    As Integer
    Dim b(1) As Byte
   
    n = &HABCD
   
    b(0) = n And 255
    If n > 0 Then
       b(1) = (n \ 256)
       Else
       b(1) = (n \ 256) + 255
       End If
    MsgBox Hex$(b(1))   ' --> AB
    MsgBox Hex$(b(0))   ' --> CD
   
End Sub

Daniel
0

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

Posez votre question
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
11 févr. 2007 à 22:00
il y a encore d'autres méthodes
je parle pas de CopyMemory non utilisable en .net

' passer par une chaîne Hexa
Private Sub Command3_Click()
    Dim n    As Integer
    Dim b(1) As Byte
    Dim temp As String
   
    n = &HABCD

    temp = Hex$(n)
    b(0) = CByte("&H" & Right$(temp, 2))
    b(1) = CByte("&H" & Left$(temp, Len(temp) - 2))
    MsgBox Hex$(b(1))   ' --> AB
    MsgBox Hex$(b(0))   ' --> CD
   
End Sub

'passer par un fichier
Private Sub Command4_Click()
    Dim n    As Integer
    Dim b(1) As Byte
  
    n = &HABCD

    Open "C:\temp.txt" For Binary As #1
    Put #1, , n
    Close #1
    Open "C:\temp.txt" For Binary As #1
    Get #1, , b(1)
    Get #1, , b(0)
    Close #1
    MsgBox Hex$(b(1))   ' --> AB
    MsgBox Hex$(b(0))   ' --> CD
    Kill "C:\temp.txt"

End Sub

Daniel
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
11 févr. 2007 à 22:01
ce qui doit pouvoir marcher tant sous VB6 que VB.net reste l'utilisation des fonctions LoByte et Hibyte de la librairie TLBINF32 de k'Api de Windows pour les entiers sur 2 octets en 16 bits, en conjugaison avec l'utilisation des fonctions   loword et hiword de la même librairie pour les entiers exprimés sur 4 octets en 32 bits.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 févr. 2007 à 23:31
Vaut mieux 1 seul appel CopyMemory(), je ne pense pas qu'on puisse faire plus court en VB.

ciao...
BruNews, MVP VC++
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 févr. 2007 à 06:31
dépend...

si c'est une tache redondante, tu peux manipuler un SafeArray, pour que ton Integer et ton tablea   utilisent la même zone mémoire...

ainsi, manipuler ton tableau ou ton integer, même combat, sans aucune opération...

regardes ce code, qui fait joujou avec des bytes et un Long, pour bidouiller des couleurs, et A,R,G et B :

http://www.vbfrance.com/codes/RGB-VICE-VERSA-TRES-RAPIDE_40189.aspx

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 févr. 2007 à 09:34
Tu fais aussi appel à CopyMemory(), me semble difficile de s'en passer quand on n'a pas l'usage des pointeurs.

ciao...
BruNews, MVP VC++
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 févr. 2007 à 10:01
vi, on s'en sert bel et bien BruNews, nul doute...
mais une seule fois pour toutes... efficace si on doit faire cette tache régulièrement.

si on a qu'une fois a le faire, faudrait faire :
CopyMemory MonTableau(0), MonEntier, 2
(a voir si plus rapide que des masques/calculs)

petites précision pour YvesYves, concernant la manipulation de SafeArrays :
on dit a notre tableau de taper dans notre Integer,

ensuite, qu'on modifie MonTableau(0) MonTableau(1) ou MonEntier, on manipule la même zone mémoire, la passage de l'un a l'autre se fait donc en coulisses...

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
Rejoignez-nous