2010-01-29 3 views
1

J'ai trois entiers (4 octets de mémoire pour chaque entier) et je veux assigner chacune de leurs valeurs binaires à un tableau de caractères avec 12 éléments. Donc, si chaque entier avait une valeur de disons que 2, alors je veux le tableau de caractères pour avoir ces valeurs:Affectation de plusieurs entiers à un tableau de caractères en binaire

2 0 0 0 2 0 0 0 2 0 0 0 

J'ai essayé:

memcpy(cTemp, &integer1 + &integer2 + &integer3, 12); 

mais je reçois un « opérandes invalides » erreur de compilation.

J'ai aussi trouvé la fonction strcat référencé ici: http://www.cplusplus.com/reference/clibrary/cstring/

Cependant, il est mentionné comme: « Le caractère nul dans la destination est remplacée par le premier caractère de source » que je ne veux évidemment pas puisque la plupart des temps entiers auront un caractère nul à la fin, sauf si la valeur est vraiment grande. Quelqu'un connaît-il une meilleure méthode de travail? Toute aide est appréciée.

+0

Si c'est devoirs, il devrait être étiqueté comme tel. –

+0

J'espère sérieusement que ce n'est pas le cas. – avakar

+1

Pourquoi voulez-vous faire cela? Cela pourrait peut-être aider les autres à trouver une meilleure solution. – Void

Répondre

1

Si vous voulez voir comment une variable est représentée comme une séquence d'octets, vous pouvez procéder comme suit.

int i[3] = {2, 2, 2}; 
char cTemp[sizeof i]; 
memcpy(cTemp, &i, sizeof i); 

Notez cependant que la représentation sera différente sur différentes plates-formes. Qu'essayez-vous de résoudre?

Edit:

Je suis en train d'écrire un programme pour éditer [un fichier], et le fichier arrive à stocker des entiers en binaire.

Pourquoi ne l'avez-vous pas dit en premier lieu? Si vous savez que le programme ne fonctionnera que sur les plates-formes où int a la disposition de la mémoire correcte, vous pouvez simplement stocker l'entier. Cependant, si vous voulez être portable, vous devez le sérialiser correctement.

void store_uint32_le(char * dest, unsigned long value) 
{ 
    for (int i = 0; i < 4; ++i) 
    { 
     *dest++ = value & 0xff; 
     value >>= 8; 
    } 
    assert(value == 0); 
} 

int main() 
{ 
    char serialized[12]; 
    store_uint32_le(serialized, 2); 
    store_uint32_le(serialized + 4, 2); 
    store_uint32_le(serialized + 8, 2); 

    std::ofstream fout("myfile.bin", std::ios::binary); 
    fout.write(serialized, sizeof serialized); 
} 
+0

Cela affectera la valeur binaire de 2 une fois à un tableau de 4 éléments. Ce n'est pas ce que je veux. – kaykun

+0

Voilà. Ou ai-je mal compris la question? Peut-être pourriez-vous clarifier. – avakar

+0

J'ai essayé cette méthode, et il semble seulement copier la mémoire du premier élément de i. J'ai même essayé de changer le troisième paramètre de memcpy à 12. – kaykun

1

Il est probablement plus simple (si vous êtes sur un x86 au moins: P) de simplement lancer le pointeur et l'assigner directement. à savoir

int* p = (int*) cTemp; 
p[0] = a; 
p[1] = b; 
p[2] = c; 
+0

Ce comportement n'est pas défini et échouera sur la plupart des plates-formes (celles qui n'aiment pas l'accès non aligné). – avakar

+0

d'où le point que j'ai fait à propos de l'exigence de plates-formes x86, encore il convient de souligner que _most_ plates-formes sont x86 de nos jours de toute façon. – tyranid

+0

La plupart des plates-formes * de bureau * sont basées sur x86. Et c'est encore un comportement indéfini même sur ceux-ci. – avakar

1

Vous pouvez également faire un hack union:

union translate { 
    char c[sizeof(int) * 3]; 
    int i[3]; 
}; 

translate t; 
t.i[0] = 2; 
t.i[1] = 2; 
t.i[2] = 2; 

// access t.c[x] to get the chars 

... et lire les caractères ...

0

Je pense que cela devrait fonctionner:

int i,j,k; 

char a[12]; 

*((int*)a) = i; 
*(((int*)a)+1) = j; 
*(((int*)a)+2) = k; 
+0

Comme tyranid, ceci est un comportement indéfini. – avakar

+0

Je suppose que vous voulez dire que certaines plates-formes pourraient aligner les éléments du tableau char. Puisque les tableaux sont définis comme contigus, cela signifierait sizeof (char) == word_length (par exemple 4). Pourriez-vous me donner un exemple d'architecture pour laquelle cela est vrai? – abc

+0

abc, la norme ne définit pas le comportement du code qui accède aux objets de type dynamique 'int' par l'intermédiaire des valeurs l du type statique' char'. C'est pourquoi le comportement n'est pas défini. Et implémentation ne sont pas autorisés à ajouter un remplissage entre les éléments d'un tableau. – avakar

Questions connexes