Я хотел бы преобразовать обычную строку NSString в строку NSString с (что я предполагаю) шестнадцатеричными значениями ASCII и обратно.
Мне нужно выдать тот же вывод, что и методы Java ниже, ноЯ не могу найти способ сделать это в Objective-C.Я нашел несколько примеров в C и C ++, но мне было трудно встраивать их в мой код.
Вот методы Java, которые я пытаюсь воспроизвести:
/**
* 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);
}
Обновление: Благодаря ответу drawonward, вот метод, который я написал для создания шестнадцатеричных строк NSS.Он выдает мне предупреждение «Инициализация сбрасывает квалификаторы из целевого типа указателя» в строке объявления символа, но это работает.
- (NSString *)stringToHex:(NSString *)string
{
char *utf8 = [string UTF8String];
NSMutableString *hex = [NSMutableString string];
while ( *utf8 ) [hex appendFormat:@"%02X" , *utf8++ & 0x00FF];
return [NSString stringWithFormat:@"%@", hex];
}
У нас еще не было времени написать метод декодирования.Когда я это сделаю, я отредактирую это, чтобы опубликовать его для всех, кто интересуется.
Update2: Таким образом, метод, который я разместил выше, фактически не выводит то, что я ищу.Вместо вывода шестнадцатеричных значений в формате 0-f вместо этого выводились все числа.Я наконец вернулся к работе над этой проблемой и смог написать категорию для NSString, которая точно дублирует методы Java, которые я опубликовал.Вот оно:
//
// 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