Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Comportement bizarre de CopyMemory [ Windows / API ] (mJuJu)

lundi 14 juillet 2008 à 21:14:43 | Comportement bizarre de CopyMemory

mJuJu

Bonjours à tous.

Voici ma question:

j'ai voulu utiliser l'API COPYMEMORY pour transférer rapidement un tableau de Bytes dans un tableau de Longs. Bien sûr j'ai fait en sorte que la taille du tableau de Bytes soit 4 fois plus grande que celle du tableau de Longs. Par exemple j'ai un tableau de 32 Bytes que je veux transférer dans un tableau de 8 Longs (32 octets). 

Le transfert s'effectue. Mais je trouve la chose étrange. Alors je simplifie et tente de transférer ce tableau:

tByte(1) = 8   soit  00001000
tByte(2) = 4   soit  00000100  
tByte(3) = 1   soit  00000001
tByte(4) = 9   soit  00001001

vers ce Long lDest  avec l'API   COPYMEMORY lDest, tByte(1), 4

La copie s'effectue MAIS je retrouve dans le Long la valeur 151061512 ce qui correspond en binaire à

1001000000010000010000001000  soit octet par octet  9148 !! La valeur du tableau de Byte à l'envers.

POURQUOI DONC ?

Votre aide sera la bienvenue. D'avance merci.

mJuJu


lundi 14 juillet 2008 à 21:23:14 | Re : Comportement bizarre de CopyMemory

DARKSIDIOUS

Membre Club Administrateur CodeS-SourceS
Salut,

Je m'y connais pas assez en système pour être catégorique, mais je dirais que cela ;vient du mode de stockage de windows en mémoire : avec les little-endian et high-endian, selon le mode utilisé, la réprésentation d'un WORD en mémoire est différente (inversion ou non des bits). Je laisse les experts confirmer ou infirmer mes propos !
______________________________________
DarK Sidious

mardi 15 juillet 2008 à 00:18:24 | Re : Comportement bizarre de CopyMemory

Galain

Membre Club
Réponse acceptée !
Salut

comme dit DARKSIDIOUS Windows stocke les mots de 16 bits et les double-mots de 32 bits à l'envers

Soit la valeur 32 bits   04030201        soit en héxa &H4321

Windows la stocke ainsi à l'adresse mémoire ADR : 01   ' poids faibles en premier
                                                                    ADR +1 : 02
                                                                    ADR +2 : 03
                                                                    ADR +3 : 04  ' poids forts en dernier

par contre il n'y a aucune inversion de bits : c'est une inversion des octets

Autre chose : des bytes ce sont des bytes et des long ce sont des long : à ne pas mélanger car les longs peuvent être négatifs alors que les bytes non

GRENIER Alain

mardi 15 juillet 2008 à 00:27:26 | Re : Comportement bizarre de CopyMemory

Galain

Membre Club
Si tu veux garder ce type de fonctionnement
Avant le copymemory inverse les bytes 2 à 2 (Byte1 avec Byte 4 et Byte2 avec Byte3)

dim temp as byte

temp = tByte(1)
tByte(1) =tByte(4)
tByte(4) = temp
temp = tByte(2)
tByte(2) = tByte(3)
tByte(2)= temp
COPYMEMORY lDest, tByte(1), 4

GRENIER Alain

mardi 15 juillet 2008 à 00:38:46 | Re : Comportement bizarre de CopyMemory

Galain

Membre Club
dim temp as byte

temp = tByte(1)
tByte(1) =tByte(4)
tByte(4) = temp
temp = tByte(2)
tByte(2) = tByte(3)
tByte(3)= temp       ' erreur dans le post précédent
COPYMEMORY lDest, tByte(1), 4


GRENIER Alain

mardi 15 juillet 2008 à 01:29:22 | Re : Comportement bizarre de CopyMemory

ghuysmans99

Membre Club
@ Galain : Dans ce cas, c'est d'un bit que tu parles, pas d'un byte (octet)
_______________________________________________________________________
VB.NETis good ...VB6is better

mardi 15 juillet 2008 à 01:42:54 | Re : Comportement bizarre de CopyMemory

Galain

Membre Club
Salut ghuysmans99

DARKSIDIOUS avait marqué (inversion ou non des bits) alors que c'est une inversion des octets

VB.NET and VB6 are good : moi je prends les 2

GRENIER Alain

mardi 15 juillet 2008 à 08:36:06 | Re : Comportement bizarre de CopyMemory

ghuysmans99

Membre Club
Nan ... Exemple : 1011 (base 2) fait 11 (base 10).
Quand je dis 'bit', je veux parler des 1 et des 0, en binaire (base 2)
Un byte c'est un nombre de 0 à 255 inclus
_______________________________________________________________________
VB.NETis good ...VB6is better

mardi 15 juillet 2008 à 09:12:42 | Re : Comportement bizarre de CopyMemory

Renfield

Administrateur CodeS-SourceS
ce sont bel et bien les octets (bytes) qui sont inversés.

mardi 15 juillet 2008 à 10:55:41 | Re : Comportement bizarre de CopyMemory

ghuysmans99

Membre Club
OOps ... C'est juste !
_______________________________________________________________________
VB.NETis good ...VB6is better



Cette discussion est classé dans : tableau, longs, bytes, transférer, copymemory


Répondre à ce message

Sujets en rapport avec ce message

Tableau de bytes en VB.NET [ par Saros ] C'est une question sur VB.NET, que je suis en train d'apprendre...Donc voilà : l'objet 'System.IO.FileStream' permet de manipuler des fichiers, c'est Former un entier avec deux bytes [ par bilat0 ] Bonsoir,Ma question est simple... mais si qqn y connait une réponse j'en serais ravi !J'ai un tableau tableau() as Byte.Dans ce tableau sont répartis Creer des image par la fonction FromStream [ par milo2009 ] Salut, Je travaille actuellement sur un code qui permet de recupéré le code d'un fichier bmp dans un tableau de bytes. Mon truc, c'est que je voudra Integer to Bytes() [ par yvesyves ] 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-c Tableau de bytes vers une picturebox [ par milo2009 ] Salut,J'aimerai savoir s'ilest possible sous vb2005 de charger une picturebox a partir du code d'une image contenu dans un tableau de bytes.Merci Gestion d'un tableau de Bytes [ par cuzco38 ] Bonjour,Je n'arrive pas à gérer corectement des données binérairesexplication:Via un socket winsock je fais un download ftp d'un fichier binaire volum Hexadecimal [ par Myke ] J'ai besoin d'aide pour comprendre comment travailler avec les Hexadecimal sous vb.net. J'ai de la documentation que j'utilise pour programmer un genr Stocker un tableau en mémoire un tableau [ par eliefr78 ] Bonjour,Je solicite votre aide car je voudrais simplifier mon code au maximum.Je cherche à stocker dans une "mémoire interne" un tableau que j'aurais tableau de byte [ par jabaka ] Salut j' ai le problème qui suitDim buffer AsByte() = <f boucle [ par fne67 ] J'ai des cases que j'ai nommées de M12HC à M80HC j'aimerai boucler sur ce tableau et de récupérer la valeur inscrite dans la case et de l'inscrire dan


Nos sponsors

Sondage...

CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,234 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.