Help C en delphi [Résolu]

FFCAST 37 Messages postés jeudi 1 juillet 2004Date d'inscription 2 novembre 2015 Dernière intervention - 14 janv. 2011 à 12:29 - Dernière réponse : Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention
- 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
Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention - 15 janv. 2011 à 02:57
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 !

Merci Bacterius 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 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.