begin process at 2008 08 22 00:59:30
1 229 731 membres
3 nouveaux aujourd'hui
14 267 membres club

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)

Comportement bizarre de CopyMemory le 14/07/2008 21:14:43

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


Re : Comportement bizarre de CopyMemory le 14/07/2008 21:23:14

DARKSIDIOUS
Membre Club
(Admin CS)
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

Re : Comportement bizarre de CopyMemory le 15/07/2008 00:18:24

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

Re : Comportement bizarre de CopyMemory le 15/07/2008 00:27:26

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

Re : Comportement bizarre de CopyMemory le 15/07/2008 00:38:46

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

Re : Comportement bizarre de CopyMemory le 15/07/2008 01:29:22

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

Re : Comportement bizarre de CopyMemory le 15/07/2008 01:42:54

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

Re : Comportement bizarre de CopyMemory le 15/07/2008 08:36:06

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

Re : Comportement bizarre de CopyMemory le 15/07/2008 09:12:42

Renfield
(Admin CS)
ce sont bel et bien les octets (bytes) qui sont inversés.

Re : Comportement bizarre de CopyMemory le 15/07/2008 10:55:41

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


Classé sous : tableau, longs, bytes, transférer, copymemory

Participer à cet échange

Pub



Appels d'offres

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Boutique

Boutique de goodies CodeS-SourceS