Bonjour à tous
Little-endian a encore frappé.
En effet seules, les architectures Motorola 68000, les SPARC (Sun Microsystems) ou encore les System/370 (IBM). Ou le protocole TCP/IP, sont en big-endian ou gros-boutistes ou mot de poids fort en tête.
Mais Intel a préféré le Little-endian ou les poids les plus faibles sont en tête c'est-à-dire dans l’adressage le plus faible.
Attention l’unité adressage est l’octet.
Donc si vous visualisez un octet en hexa ou en binaire il n’y a aucune inversion des bits ou du demi octet dans cette unité c'est à dire dans l'octet.
En little-endian les nombres ont des octets qui sont placés en ordre de poids, du poids le plus faible à la plus faible adresse jusqu’au poids le plus fort dans l’adresse la plus forte.
Enfin pour retrouver les nombres dans l’ordre dans lesquels on les lit en occident il suffit d’utiliser par exemple :
Soit Bin(..)
Soit Hex(..)
Resultat$ = Hex(Valeur.q [, Type])
Description
Convertit un entier en une valeur hexadécimale.
Arguments
Valeur.q Un entier de type 'quad'.
Type (optionnel) #PB_Quad : valeur sera traitée en quad (0 à 18446744073709551615)
#PB_Byte : La valeur est un octet (8-bit) allant de 0 à 255
#PB_Ascii : La valeur est un octet (8-bit) allant de 0 à 255
#PB_Word : La valeur est un word (16-bit) allant de 0 à 65535
#PB_Unicode: La valeur est un word (16-bit) allant de 0 à 65535
#PB_Long : La valeur est un long (32-bit) allant de 0 à 4294967295
Exemples sous PB560 en unicode
On peut remarquer dans le dump de la variable numer l’ordre des octets en parfait concordance avec la définition de litte-endian.
Code : Tout sélectionner
structure NUM
VB.B
VW.w
VL.l
Vq.q
VF.F
VD.D
VS.s{18}
EndStructure
macro _HEX (__ad,lng,flag)
; CompilerIf #PB_Compiler_Unicode =0
; ; en ascii le nombre d'octets est le même que la longueur en caractères lng=lng
; CompilerElse
; ; en unicode le nombre d'octets est double de la longueur en caractères
; lng=lng*2
; CompilerEndIf
sort.s=""
hexs.s=""
cart$=""
If flag=0
; ; teth.s=" Unité 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1"+#LF$
teth.s="Adresse___00_01_02_03_04_05_06_07_08_09_0A_0B_0C_0D_0E_0F_10_11_12_13_14_15_16_17_18_19_1A_1B_1C_1D_1E_1F_20_21_22_23_24_25_26_27_28_29_2A_2B_2C_2D_2E_2F_30_31_32_33_34_35_36_37_38_39_3A_3B_3C_3D_3E_3F_40_41"
sort.s=Left(teth,(lng-1)*3+12)+" ASCII"+#LF$
flag=1
EndIf
For i=0 To lng-1
num.c=PeekA(__ad+i)
If Chr(num)<" " or num>128
cart$=cart$+"."
Else
cart$=cart$+Chr(num)
EndIf
hexs.s=hexs.s+RSet(Hex(num),2,"0")+"_"
Next
sort.s+RSet(Hex(__ad),8,"0")+" "+hexs+" "+cart$+#LF$
debug sort
endmacro
lng=16
define numer.num
numer\VB=$EF
numer\VW=$1234
numer\VL=$56789ABC
numer\Vq=$0123456789ABCDEF
numer\VS="Jean-Claude Durand"
flg=0
__ad=numer
_hex(__ad,lng,flg)
debug "VB="+hex(numer\VB,#PB_Byte )
debug "VW="+hex(numer\VW,#PB_Word )
debug "VL="+hex(numer\Vl,#PB_Long )
debug "VQ="+hex(numer\Vq,#PB_Quad )
__ad=@numer\VS
lng=36 ; doubler le nombre d'octets en unicode donner le nombre de caractère en ascii
flg=0
_Hex(__ad,lng,flg)
A+