Help C en delphi [Résolu]

Messages postés
37
Date d'inscription
jeudi 1 juillet 2004
Dernière intervention
2 novembre 2015
- - Dernière réponse : Bacterius
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Dernière intervention
3 juin 2016
- 15 janv. 2011 à 02:57
bonjour !

j'ai un petit soucis. J'ai un code en C qui a été fait sous linux et je voudrai le mettre en delphi pour windows. Le seule hic, c'est qu'il y a une partie que je n'arrive pas à faire. Si quelqu'un pouvait m'aider ça serait très gentit de sa part.

le code source est le suivant :

#define u64 unsigned long long
#define u32 unsigned int
#define u16 unsigned short int
#define u8 unsigned char


u64 get_u64(void* vd) {
u8 *d = (u8*)vd;
return ((u64)d[0]<<56) | ((u64)d[1]<<48) | ((u64)d[2]<<40) | ((u64)d[3]<<32) | (d[4]<<24) | (d[5]<<16) | (d[6]<<8) | d[7];
}

void set_u64(void* vd, u64 v) {
u8 *d = (u8*)vd;
d[0] = v>>56;
d[1] = v>>48;
d[2] = v>>40;
d[3] = v>>32;
d[4] = v>>24;
d[5] = v>>16;
d[6] = v>>8;
d[7] = v>>0;
}









et si possible me dire à quoi corespond :

U8
U16
U32
U64

en delphi en signeé et non signé, merci !

Voila, c'est pour la partie du dessus pour laquelle j'ai besion d'aide. Pour le reste, je pourrai me debrouiller je pense mais si vous voulez voir l'ensenble du code source le voici :



#define u64 unsigned long long
#define u32 unsigned int
#define u16 unsigned short int
#define u8 unsigned char


u64 get_u64(void* vd) {
u8 *d = (u8*)vd;
return ((u64)d[0]<<56) | ((u64)d[1]<<48) | ((u64)d[2]<<40) | ((u64)d[3]<<32) | (d[4]<<24) | (d[5]<<16) | (d[6]<<8) | d[7];
}

void set_u64(void* vd, u64 v) {
u8 *d = (u8*)vd;
d[0] = v>>56;
d[1] = v>>48;
d[2] = v>>40;
d[3] = v>>32;
d[4] = v>>24;
d[5] = v>>16;
d[6] = v>>8;
d[7] = v>>0;
}

void set_u32(void* vd, u32 v) {
u8 *d = (u8*)vd;
d[0] = v>>24;
d[1] = v>>16;
d[2] = v>>8;
d[3] = v>>0;
}

void set_u16(void* vd, u16 v) {
u8 *d = (u8*)vd;
d[0] = v>>8;
d[1] = v>>0;
}

u32 get_u32(void* vd) {
u8 *d = (u8*)vd;
return (d[0]<<24) | (d[1]<<16) | (d[2]<<8) | d[3];
}

float get_float(u8* d) {
float ret;
u32 inter = (d[0]<<24) | (d[1]<<16) | (d[2]<<8) | d[3];
memcpy(&ret, &inter, 4);
return ret;
}

u32 get_u16(void* vd) {
u8 *d = (u8*)vd;
return (d[0]<<8) | d[1];
}

void hexdump(u8* d, int l) {
int i;
for(i=0;i<l;i++) {
if(i!=0 && (i%16)==0) printf("\n");
printf("%2.2X ", d[i]);
}
printf("\n");
}


void hexdump_nl(u8* d, int l) {
int i;
for(i=0;i<l;i++) {
printf("%2.2X ", d[i]);
}
printf("\n");
}

void hexdump_ns(u8* d, int l) {
int i;
for(i=0;i<l;i++) {
printf("%2.2X", d[i]);
}
}

void hexdump_c(u8* d, int l) {
int i;
for(i=0;i<l;i++) {
printf("0x%2.2X", d[i]);
if(i!=(l-1)) {
printf(",");
}
}
}

void hexdump_32(u8* d, int l) {
int i;
for(i=0;i<l;i+=4) {
if(i!=0 && (i%16)==0) printf("\n");
printf("%8X ", get_u32(d+i));
}
printf("\n");
}



cordialement
FFcast
Afficher la suite 

Votre réponse

1 réponse

Meilleure réponse
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Dernière intervention
3 juin 2016
3
Merci
unsigned long long = pour Delphi 2005 et +, UInt64, avant on n'a pas d'équivalent, au pire utilise Int64 qui est un long long (signé )
unsigned int = Longword (ou Cardinal)
unsigned short int = Word
unsigned char = Byte

u64 get_u64(void* vd) { 
u8 *d = (u8*)vd; 
return ((u64)d[0]<<56) | ((u64)d[1]<<48) | ((u64)d[2]<<40) | ((u64)d[3]<<32) | (d[4]<<24) | (d[5]<<16) | (d[6]<<8) | d[7]; 
}

void set_u64(void* vd, u64 v) { 
u8 *d = (u8*)vd; 
d[0] = v>>56; 
d[1] = v>>48; 
d[2] = v>>40; 
d[3] = v>>32; 
d[4] = v>>24; 
d[5] = v>>16; 
d[6] = v>>8; 
d[7] = v>>0; 
}


Le code en Delphi utilisant le transtypage fort "à la Delphi" :
type
 u64 = Int64; // ou UInt64 si Delphi 2005 et +
 u32 = Longword;
 u16 = Word;
 u8 = Byte;

// Récupère le u64 à l'adresse vd
function get_u64(vd: Pointer): u64;
begin
  Result := Int64(vd^);
end;

// Met la valeur de l'u64 à l'adresse vd à la valeur v
procedure set_u64(vd: Pointer; v: u64);
begin
 CopyMemory(vd, @v, SizeOf(u64));
end;


NOTE : il est possible que ce code ait été écrit pour les machines big-endian, or moi je suis en little-endian, donc si tu rencontre des problèmes avec ce code (pas la compilation, l'exécution) il est peut-être nécessaire de procéder à une inversion des octets pour être en accord avec la convention big-endian. Voici un snippet qui pourra alors se rendre utile (de f0xi) : http://www.codyx.org/snippet_inverser-octets-dword_112_ct_delphi_628.aspx

Cordialement, Bacterius !

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de Bacterius

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.