Вопрос

Это еще одна трещина в моей проблеме 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), насколько вы обеспокоены, вы должны относиться к нему как идеальную строку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top