La conversion Char tableau de Long en C
Cette question semble stupide, mais s'il vous plaît me guider
J'ai une fonction pour convertir les données d'une longueur de char tableau
void ConvertLongToChar(char *pSrc, char *pDest)
{
pDest[0] = pSrc[0];
pDest[1] = pSrc[1];
pDest[2] = pSrc[2];
pDest[3] = pSrc[3];
}
Et j'appelle la fonction ci-dessus comme ceci
long lTemp = (long) (fRxPower * 1000);
ConvertLongToChar ((char *)&lTemp, pBuffer);
Qui fonctionne très bien.
J'ai besoin d'une fonction similaire pour inverser la procédure. Convertir char tableau de long.
Je ne peux pas utiliser atol ou des fonctions similaires.
OriginalL'auteur AjayR | 2011-07-14
Vous devez vous connecter pour publier un commentaire.
Laissant la charge de la correspondance de l'endianness avec votre autre fonction que pour vous, voici un moyen:
Juste pour être sûr, ici, est le correspondant dans une autre direction:
Allant de
char[4]
à long et à l'arrière est entièrement réversible; allez de temps pourchar[4]
et à l'arrière est réversible pour une valeur allant jusqu'à 2^32-1.Noter que tout cela n'est bien définies pour les types non signés.
(Mon exemple est peu endian si vous lisez
pdest
de gauche à droite.)Addendum: je suis aussi en supposant que
CHAR_BIT == 8
. En général, remplacer les multiples de 8 par multiples deCHAR_BIT
dans le code.OriginalL'auteur Kerrek SB
Que vous pouvez faire:
et l'accès
c[0] c[1] c[2] c[3]
. C'est bon comme il ne perd pas de mémoire et est très rapide car il n'y a pas de changement ou toute cession d'ailleurs la première et il fonctionne dans les deux sens.Il est aussi, selon la norme C++, un comportement indéfini. 🙂
C'est un C question.
juste assez. Il est aussi, selon la norme, un comportement indéfini. 🙂
^ Ce que les compilateurs n'est pas réellement instructif à propos de ce que dit la Norme, si vous arrivé à être à corriger de toute façon. @jalf.com Non, C fait type beaucoup les jeux de mots par l'intermédiaire d'un
union
bien spécifié dans le C99 à partir de: stackoverflow.com/questions/11639947/... C++ pas hériter cela, cependant.OriginalL'auteur Vinicius Kamakura
Un moyen simple serait d'utiliser memcpy:
Qui ne se prend pas endianness en compte, cependant, alors méfiez-vous si vous devez partager des données entre plusieurs ordinateurs.
OriginalL'auteur Etienne de Martel
Si vous voulez dire à traiter
sizeof (long)
octets de la mémoire comme un seul long, alors vous devriez le faire ci-dessous:Cette chose peut être fait par collage de chacun des octets de long à l'aide de décalage de bits sna-coller, comme ci-dessous.
Si vous voulez convertir "1234\0" chaîne dans 1234L alors vous devriez
OriginalL'auteur phoxis
Fait ce travail:
oh désolé, mon mauvais. Cochez la case modifier. Son travail de 100% de fines.
vous avez raison avec votre exemple. Dans Mon cas, il n'est pas long données, mais octets qu'il s'agit de stocker, de sorte que cette solution fonctionne pas pour moi
OriginalL'auteur
C'est sale, mais il fonctionne:
OriginalL'auteur Vin'Z
Méfiez-vous des chaînes de valeur null comme vous vous en fin de copie de tous les octets au-delà de le terminateur null dans
combined
; ainsi dans l'affectation ci-dessus,charArray
doit être tout à zéro d'initialisation pour un "nettoyage" de la conversion.OriginalL'auteur Engineer