2010-02-12 3 views
1

Je travaille sur un système OSX 64 bits x_86 64 bits. Je lis le fichier de la base de données existante. Il est chargé dans un bloc de mémoire et utilise les décalages qu'il lit pour les structures. Il est écrit en mode 32 bits. Donc, pour lire correctement en mode 64 bits, Je souhaite ajouter n octets à l'adresse de base d'une structure.Comment ajouter n octets dans un système 64 bits

Depuis incrément pointeur incement

ne me permet pas de le faire Comme il est en mode 64 bits chaque pointeur est b octets de long.

Cordialement, Dhana.

J'ai posté un code ici. Je suppose qu'il est juste ..

struct CamNodeTag { 
      CamNodeTag *nextCam; // next cam 
      SInt32 numMake; 
      char *menuMake; 
    }; 

    long pBaseAddr; // this is long so we an offset bytes from it. 

    //Get the size of of the structure in 32 bit environment.//in 64 bit envi it is 20 bytes. 
    int CamNodeTagSizeIn32BitMode = 12; 


    //Do it in a while loop.. 
int i=0; 
CamNodeTag * pNode = (CamNodeTag *)(pBaseAddr + i*CamNodeTagSizeIn32BitMode); 

while(pNode !=NULL) 
{ 
    //Do the cam stuff here.. 

// to get the next node, we add the base addr to the offset 


//This will give next cam 
i++; 
    pNode = (CamNodeTag *)(pBaseAddr + i*CamNodeTagSizeIn32BitMode); 

} 
+2

Que diriez-vous de montrer la structure? Peut-être quelques exemples de données et le résultat attendu aussi? – wallyk

+0

struct CamNodeTag { CamNodeTag * nextCam; // next cam SInt32 numMake; char * menuMake; }; J'ai dis 10 copies de la structure ci-dessus dans la mémoire Et j'ai l'adresse de base de la mémoire Im mémoire, il est chargé en mode 32 bits. Je veux lire une structure après une autre structure. – Dhanaraj

+1

Je ne comprends pas - du code les a déjà chargés? Les pointeurs sont des pointeurs 32 bits valides, ou des décalages par rapport à la 'base', ou? – Will

Répondre

1

Je recommandons plutôt que vous avez lu le fichier à partir du disque en utilisant les fonctions que vous écrivez telles que read_uint32_whatever_endian(FILE*) et autres, et les stocker dans votre nouvelle 64bit en mémoire struct s.

Ceci isole votre nouveau code des choix faits par le compilateur sur la structure de la mémoire de vos structures.

Sur une machine moderne, le coût de performance d'une telle analyse est si minime que je suis sûr que vous pouvez difficilement le mesurer.

Bien qu'il y ait une légère coin cas où les fichiers de base de données nmap ed grandes qui stockent la même structure binaire comme la représentation en mémoire du compilateur est un plus, ce cas ne vaut pas beaucoup dans la pratique.

Les avantages d'un sérialisation différent sur le disque à la mémoire offrent beaucoup d'avantages pratiques:

  • il est portable - vous pouvez exécuter votre code sur différents processeurs avec différents mot-tailles et différentes Boutiens sans problèmes
  • vous pouvez étendre les structures à tout moment - vous pouvez transformer les structures en mémoire en objets avec des méthodes et autres, même des méthodes C++ virtuelles, et d'autres avantages de la conception orientée objet; vous pouvez également ajouter des membres qui ne reçoivent pas sérialisé, tels que les pointeurs et d'autres domaines, et vous pouvez prendre en charge les nouvelles versions de fichiers de base de données facilement
+0

Le problème ici est que je n'ai pas créé ou écrit ce fichier. Et ceci est un fichier en lecture seule. – Dhanaraj

+0

@Dhanaraj: Qu'est-ce que Will suggère est une encapsulation de la façon dont vous * lisez * vos données, il n'y a pas d'écriture impliqués. – unwind

1

Afin de faire avancer un pointeur par autre chose que sa taille d'origine, vous avez lancer sur char *. Pour lire à partir d'un fichier utilisant des valeurs de 32 bits en tant que «pointeurs» à l'aide d'un processeur 64 bits, vous devez redéfinir vos structures afin que les champs qui étaient auparavant des pointeurs aient une taille de 32 bits.

typedef int Off32; // our "pointers" need to be 32 bit ints rather than pointers. 

struct CamNodeTag { 
    Off32 nextCam; // next cam 
    SInt32 numMake; 
    Off32 menuMake; 
}; 

char * pBaseAddr; // this is char * so we an offset bytes from it. 

// set this to point to the first node. 
CamNodeTag * pNode = (CamNodeTag *)(pBaseAddr + first_node_offset); 

// to get the next node, we add the base addr to the offset 
// in the structure. 

pNode = (CamNodeTag *)(pBaseAddr + pNode->nextCam); 

// assuming that the menuMake pointer is also an offset from the base 
// use this code to get the actual pointer. 
// 
char * pMenu = (pBaseAddr + pNode->menuMake); 
+0

Désolé, je ne peux pas indenter ce code dans la section des commentaires. char * (ou n'importe quel pointeur) prend 8 octets dans le système 64 bits. CamNodeTag * pNode = (CamNodeTag *) (pBaseAddr + first_node_offset); Ici, il est comme ((CamNodeTag *) (pBaseAddr + (first_node_offset * 8 octets)); Ainsi, au lieu à long baseAddr = (long) pBaseAddr; puis ((CamNodeTag *) (baseAddr + first_node_offset); Il devrait fonctionner correctement – Dhanaraj

+0

@Danaraj: vous pouvez modifier votre message original. –

Questions connexes