0 votes

Comment copier un byte[] dans un char* ?

Tout ce dont j'ai besoin, c'est de strcpy().

Je veux savoir si les trois premiers octets d'un tampon (tableau d'octets) sont "JMX" en tant que chaîne de caractères.

Voici ce que j'ai fait jusqu'à présent :

char * ddj;
strcpy( ddj, buffer ); //buffer is BYTE[]
if ( strcmp( "JMX", ddj ) == 0 ) //check first three chars are "JMX"
{
    buffer += 20;   //increase the index with 20
    size -= 20;     //int
}

J'obtiens une exception à la ligne strcmp(). Quel est le problème ?

J'aurais aimé écrire cela en C# :(

8voto

Stephan202 Points 27707

Mais il y a des choses qui ne vont pas :

  1. ddj ne renvoie à aucune mémoire réelle. La copie aura donc un comportement indéfini
  2. La copie n'est pas nécessaire en premier lieu.

Voici ce que vous pouvez faire :

if(strncmp("JMX", buffer, 3) == 0) {
  buffer += 20;
  size -= 20;
}

Il s'agit d'utiliser strncmp au lieu de strcmp ce qui garantit qu'il n'y a pas plus de trois octets comparés. Si l'on ne peut pas comparer plus de trois octets, il est possible de le faire. buffer peut contenir moins de trois octets, vous devez faire quelque chose comme :

if(buf_len >= 3 && strncmp("JMX", buffer, 3) == 0) {
  buffer += 20;
  size -= 20;
}

6voto

Adam Rosenfield Points 176408

Vous n'allouez pas de mémoire pour ddj . Comme il s'agit d'une variable locale, elle est allouée sur la pile. Les variables locales ne sont pas initialisées à 0/faux/NULL par défaut, donc la valeur de ddj immédiatement après sa déclaration n'est pas définie -- elle aura la valeur de ce qui reste en mémoire à cet endroit précis de la pile. Toute tentative de déréférencement (c'est-à-dire de lecture ou d'écriture de la mémoire vers laquelle il pointe) aura un comportement indéfini. Dans votre cas, il se bloque parce qu'il pointe vers une adresse invalide.

Pour résoudre ce problème, vous devez allouer de l'espace de stockage pour les éléments suivants ddj . Vous pouvez soit allouer un stockage statique sur la pile, soit un stockage dynamique sur le tas. Pour allouer un espace de stockage statique, procédez comme suit

// Allocate 64 bytes for ddj.  It will automatically be deallocated when the function
// returns.  Be careful of buffer overflows!
char ddj[64];

Pour allouer un espace de stockage dynamique :

// Allocate 64 bytes for ddj.  It will NOT be automatically deallocated -- you must
// explicitly deallocate it yourself at some point in the future when you're done
// with it.  Be careful of buffer overflows!
char *ddj = new char[64];
...
delete [] ddj;  // Deallocate it

Au lieu de gérer vous-même le stockage, il serait préférable d'utiliser std::string qui s'occupe automatiquement de la gestion de la mémoire.

Enfin, puisque vous ne faites que comparer les trois premiers caractères de la chaîne, il n'est pas nécessaire de faire des pieds et des mains pour copier la chaîne et la comparer. Il suffit d'utiliser strncmp() :

if(strncmp(buffer, "JMX", 3) == 0)
{
    ...
}

2voto

Naveen Points 37095

Vous n'avez pas alloué de mémoire à ddj. Allouez de la mémoire en utilisant new. Par exemple

char *ddj = new char[size]; //Allocate size number of chars
//do the required comaprisons

delete[] ddj; //Remember to release the memory.

D'autre part, vous pouvez utiliser std::string qui est une classe de chaîne de caractères standard.

2voto

Dario Points 26259

Vous devez allouer une nouvelle mémoire pour ddj . Soit le déclarer comme

char ddj[NAX_LENGTH];

ou avec une allocation dynamique

char* ddj = new char[length]; // You must use delete[] to free the memory in the end.

Une alternative plus pratique est std::string .

1voto

Mark Ingram Points 24995

Tout d'abord, il se bloque parce que ddj n'indique rien.

Deuxièmement, il n'est pas nécessaire de copier les données de byte[] à char* (il s'agit essentiellement de la même chose). Vous pouvez simplement faire :

if (strncmp("JMX", reinterpret_cast<char*>(buffer), 3) == 0)
{
  // Strings are equal, do what you want
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X