Me gustaría convertir un NSString normal en un NSString con los (lo que supongo que son) valores hexadecimales ASCII y viceversa.Cómo convertir un NSString en valores hexadecimales
Necesito producir el mismo resultado que los métodos de Java a continuación, pero parece que no puedo encontrar la manera de hacerlo en Objective-C. He encontrado algunos ejemplos en C y C++ pero me ha costado trabajo incorporarlos en mi código.
Éstos son los métodos de Java que estoy tratando de reproducir:
/**
* Encodes the given string by using the hexadecimal representation of its UTF-8 bytes.
*
* @param s The string to encode.
* @return The encoded string.
*/
public static String utf8HexEncode(String s) {
if (s == null) {
return null;
}
byte[] utf8;
try {
utf8 = s.getBytes(ENCODING_UTF8);
} catch (UnsupportedEncodingException x) {
throw new RuntimeException(x);
}
return String.valueOf(Hex.encodeHex(utf8));
}
/**
* Decodes the given string by using the hexadecimal representation of its UTF-8 bytes.
*
* @param s The string to decode.
* @return The decoded string.
* @throws Exception If an error occurs.
*/
public static String utf8HexDecode(String s) throws Exception {
if (s == null) {
return null;
}
return new String(Hex.decodeHex(s.toCharArray()), ENCODING_UTF8);
}
Actualización: Gracias a drawnonward de la respuesta del método que escribí para crear las NSStrings hexagonales aquí. Me da una advertencia de "inicialización descarta calificadores del tipo de destino del puntero" en la línea de declaración de char, pero funciona.
- (NSString *)stringToHex:(NSString *)string
{
char *utf8 = [string UTF8String];
NSMutableString *hex = [NSMutableString string];
while (*utf8) [hex appendFormat:@"%02X" , *utf8++ & 0x00FF];
return [NSString stringWithFormat:@"%@", hex];
}
No he tenido tiempo para escribir el método de descodificación. Cuando lo haga, editaré esto para publicarlo para cualquier otra persona interesada.
Update2: Por lo tanto, el método que publiqué anteriormente en realidad no muestra lo que estoy buscando. En lugar de dar salida a valores hexadecimales en formato 0-f, en cambio, daba salida a todos los números. Finalmente volví a trabajar en este problema y pude escribir una categoría para NSString que duplica exactamente los métodos de Java que publiqué. Aquí está:
//
// NSString+hex.h
// Created by Ben Baron on 10/20/10.
//
@interface NSString (hex)
+ (NSString *) stringFromHex:(NSString *)str;
+ (NSString *) stringToHex:(NSString *)str;
@end
//
// NSString+hex.m
// Created by Ben Baron on 10/20/10.
//
#import "NSString+hex.h"
@implementation NSString (hex)
+ (NSString *) stringFromHex:(NSString *)str
{
NSMutableData *stringData = [[[NSMutableData alloc] init] autorelease];
unsigned char whole_byte;
char byte_chars[3] = {'\0','\0','\0'};
int i;
for (i=0; i < [str length]/2; i++) {
byte_chars[0] = [str characterAtIndex:i*2];
byte_chars[1] = [str characterAtIndex:i*2+1];
whole_byte = strtol(byte_chars, NULL, 16);
[stringData appendBytes:&whole_byte length:1];
}
return [[[NSString alloc] initWithData:stringData encoding:NSASCIIStringEncoding] autorelease];
}
+ (NSString *) stringToHex:(NSString *)str
{
NSUInteger len = [str length];
unichar *chars = malloc(len * sizeof(unichar));
[str getCharacters:chars];
NSMutableString *hexString = [[NSMutableString alloc] init];
for(NSUInteger i = 0; i < len; i++)
{
[hexString appendString:[NSString stringWithFormat:@"%x", chars[i]]];
}
free(chars);
return [hexString autorelease];
}
@end
tengo este código en su casa. Lo publicaré cuando salga del trabajo a menos que alguien me golpee. –
Hola, sé que esta es una publicación anterior. Pero me encontré con tu problema al que me enfrenté y sí. Sus hallazgos para el método 'stringFromHex' es lo que estaba buscando también. ¿Puedo saber de dónde obtienes ese método y hay un tutorial sobre él? Me gustaría entender ese método, y no puedo analizarlo por mi cuenta. Gracias. –
Lo siento, ha pasado demasiado tiempo, ya no recuerdo. –