Convertir une chaîne de données hexadécimale en NSData en Objective C (cacao)
assez nouveau développeur iPhone ici. La création d'une application pour envoyer des commandes RS232 à un appareil attend sur un socket TCP/IP de la connexion. J'ai les comms partie vers le bas, et peut envoyer des commandes ASCII amende. C'est le code hexadécimal commandes que je vais avoir des ennuis avec.
Donc disons que j'ai l'hexadécimal suivant pour envoyer des données (dans ce format):
\x1C\x02d\x00\x00\x00\xFF\x7F
Comment puis-je le convertir en un NSData objet, qui ma envoyer méthode attend?
Évidemment, cela ne fonctionne pas pour cet hex de données (mais pour des commandes ascii):
NSString *commandascii;
NSData *commandToSend;
commandascii = @"\x1C\x02d\x00\x00\x00\xFF\x7F";
commandToSend = [commandascii dataUsingEncoding:NSStringEncoding];
Pour commencer, certains de l' \x hex codes sont des caractères d'échappement, et j'obtiens un "conversion de l'entrée arrêté..." d'avertissement lors de la compilation dans XCode. Et NSStringEncoding évidemment ce n'est pas juste pour cette chaîne hexadécimale.
Donc le premier problème est de savoir comment stocker cette chaîne hexadécimale je suppose, alors comment faire pour convertir NSData.
Des idées?
source d'informationauteur Max Clarke
Vous devez vous connecter pour publier un commentaire.
Code hexadécimal dans NSStrings comme "00 05 22 1C EA 01 00 FF". "commande" est l'hex NSString.
Voici un exemple de décodeur intégré sur une catégorie sur NSString.
Si vous pouvez coder en dur les données hex:
Si votre code doit interpréter la chaîne hexadécimale (en supposant que la chaîne hexadécimale est dans une variable appelée
inputData
etlengthOfInputData
est la longueur deinputData
):C'est un vieux sujet, mais je voudrais ajouter quelques remarques.
• Numérisation d'une chaîne avec
[NSString characterAtIndex]
n'est pas très efficace.Les C chaîne de caractères en UTF8, puis numériser à l'aide d'un
*char++
est beaucoup plus rapide.• Il est préférable d'allouer
NSMutableData
avec la capacité, pour éviter les temps de bloc de redimensionnement. Je pense que NSData est encore mieux ( voir le point suivant )• Au lieu de créer NSData à l'aide de malloc, puis
[NSData dataWithBytes]
et enfin libre, l'utilisation de malloc, et[NSData dataWithBytesNoCopy:length:freeWhenDone:]
Il permet aussi d'éviter de fonctionnement de la mémoire ( réaffecter, copie, gratuit ). Le freeWhenDone booléen indique le NSData à prendre en charge le bloc de mémoire, et de les libérer quand il sera libéré.
• Voici la fonction que j'ai pour convertir hex chaînes d'octets blocs. Il n'y a pas beaucoup de contrôle d'erreur sur la chaîne d'entrée, mais l'allocation est testé.
La mise en forme de la chaîne d'entrée ( comme supprimer 0x, espaces et signes de ponctuation ) est mieux de sortir de la fonction de conversion.
Pourquoi avons-nous perdre du temps à faire un traitement supplémentaire si nous sommes sûrs que l'entrée est OK.
Si je veux coder en dur les octets, je fais quelque chose comme ceci:
Si vous êtes l'obtention de ces anti-slash-échappé octets au moment de l'exécution, essayez de le
strunvis
function.Première, c'est Xcode, avec un c minuscule.
Deuxième,
NSStringEncoding
est un type, pas un identificateur de codage. Ce code ne compile pas.Plus au point, barre oblique inverse d'échappement n'est pas un encodage; en fait, c'est en grande partie indépendante de l'encodage. La barre oblique inverse " et " x " sont des personnages, pas les octets, ce qui signifie qu'ils doivent être codées (et décodé à partir de) octets, ce qui est le travail d'un codage.
Une autre façon de faire.
Je sais que c'est un fil très vieux, mais il y a un schéma de codage en C Objectif qui peut facilement convertir votre chaîne de hex codes de caractères ASCII.
1) retirez le
\x
de la chaîne et gardant des espaces dans la chaîne il suffit de convertir la chaîne deNSData
à l'aide de :Données Hex est juste octets en mémoire, vous pensez à elle comme une chaîne de caractères, parce que c'est comment vous le voyez, mais ils pourraient représenter quoi que ce soit.
Essayez: (a tapé dans le navigateur, il peut contenir des erreurs)
etc...