Ascii к nsdata.
-
28-09-2019 - |
Вопрос
Это еще одна трещина в моей проблеме MD5. Я знаю, что вопрос с характером ASCII © (0xa9, 169). Либо так, как я вставляю символ в строку или его более высокую проблему в нижней байте.
Если я
NSString *source = [NSString stringWithFormat:@"%c", 0xa9];
NSData *data = [source dataUsingEncoding:NSASCIIStringEncoding];
NSLog(@"\n\n ############### source %@ \ndata desc %@", source, [data description]);
CC_MD5([data bytes], [data length], result);
return [NSString stringWithFormat:
@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]
];
Результат:
######### источник ©.Описание данных] = (NULL)
MD5: D41D8CD98F00B204E9800998ECF8427E.
Значения: int 169 char ©
Когда я изменил кодировку в
NSData *data = [NSData dataWithBytes:[source UTF8String] length:[source length]];
Результат
######### источник ©.Описание данных] = "<" C2>
MD5: 6465DAD1D31752BE3F3283E8F70FEEF7.
Когда я изменил кодировку в
NSData *data = [NSData dataWithBytes:[source UTF8String] length:[source lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];
Результат ############### Источник © Len 2 [Описание данных] = "<" C2A9>
MD5: A541ECDA3D4C67F1151CAD5075633423.
Когда я бегу ту же функцию в Java, я получаю
">>>>> MSG ## 251 251
md5 a252c2c85a9e7756d5ba5da9949d57ed.
Вопрос в том, что лучше всего получить тот же байт в Objc, как я в Java?
Решение 2
Благодаря объяснению Гигана в другом посте я смог это собраться вместе.
for(int c = 0; c < [s length]; c++){
int number = [s characterAtIndex:c];
unsigned char c[1];
c[0] = (unsigned char)number;
NSMutableData *oneByte = [NSMutableData dataWithBytes:&c length:1];
}
Другие советы
«ASCII к Nsdata» не имеет смысла, потому что ASCII - кодирование; Если у вас есть закодированные символы, то у вас есть данные.
Кодировка - это преобразование идеальных символов Unicode (кодовых точек) в одноразовые единицы (единицы кода), возможно, в последовательностях, таких как суррогатные пары UTF-16.
NSString более или менее идеальный объект Unicode. Содержит персонажи из строки в Unicode, независимо от какого-либо кодирования *.
ASCII - это кодирование. UTF-8 также кодировка. Когда вы просите строку для его UTF8String
, Вы просите это кодировать его персонажи как UTF-8.
NSData *data = [NSData dataWithBytes:[source UTF8String] length:[source length]];
Результат
######### source © [data description] = "<"c2>
Это потому, что вы прошли неправильную длину. Длина строки (в символах) не совпадает с количеством блоков кода (байты, в данном случае) в некотором кодировке.
Правильная длина strlen([source UTF8String])
, но вам легче и быстрее во время выполнения dataUsingEncoding:
Чтобы попросить строку создать объект NSDATA для вас.
Когда я изменил кодировку в
NSData *data = [NSData dataWithBytes:[source UTF8String] length:[source lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];
Вы не изменили кодировку. Вы все еще кодируете его как UTF-8.
Использовать dataUsingEncoding:
.
Вопрос в том, что лучше всего получить тот же байт в Objc, как я в Java?
Используйте ту же кодировку.
Там нет такой вещи, как «расширенный ASCII». Существует несколько различных кодировков, основанных на (или, по меньшей мере, совместим с) ASCII, включая ISO 8859-1, ISO 8859-9, Macroman, Windows Codepage 1252 и UTF-8. Вам нужно решить, какой из них вы имеете в виду и сообщите строку, чтобы кодировать свои персонажи с этим.
Еще лучше, продолжайте использовать UTF-8 - это почти всегда правильный выбор для в основном для текста ASCII - и вместо этого меняет код Java.
NSData *data = [source dataUsingEncoding:NSASCIIStringEncoding];
Результат:
[data description] = (null)
Истинный ASCII может только кодировать 128 возможных символов. Unicode включает в себя все без изменений ASCII, поэтому первые 128 точек кода в Unicode являются то, что может кодировать ASCII. Что-нибудь еще, ASCII не может кодировать.
я видел NSASCIIStringEncoding
вести себя как эквивалент NSISOLatin1StringEncoding
до; Похоже, что они могли бы изменить его, чтобы быть чистым кодированием ASCII, и если это так, это хорошо. В ASCII нет символа авторских прав. То, что вы видите здесь, является правильным результатом.
* Это не совсем верно; Персонажи выставляются как UTF-16, поэтому любые символы за пределами базовой многоязычной плоскости подвергаются, как суррогатные пары, не целые символы, как они будут в действительно идеальном элементе строки. Это компромисс. В SWIFT встроенный тип строки является идеальным объектом идеального Unicode; Персонажи - это символы, никогда не разделенные до закодирования. Но при работе с NSString (будь то в SWIFT или Objective-C), насколько вы обеспокоены, вы должны относиться к нему как идеальную строку.