Почему strlen () не возвращает здесь правильное количество байт?

#objective-c #base64 #byte

#objective-c #base64 #байт

Вопрос:

 NSString* data = @"UdmAjkmNQs79 J/a/MVVSACRkIo=";
NSData *key = [NSData dataFromBase64String:data];
const char *keyBytes = [key bytes];
NSLog(@"Length:  %lu", strlen(keyBytes));
  

Рассмотрим приведенный выше код. У меня есть строка base64, которая содержит 20 байт данных. Я превращаю это в байты, и мне нравится проверять количество байт. Выводится 16. Почему выводится 16 и что мне нужно сделать, чтобы получить правильное количество байт (20)?

Ответ №1:

используйте приведенный ниже код, чтобы получить длину байта данных:

 NSString* data = @"UdmAjkmNQs79 J/a/MVVSACRkIo=";
NSData *key = [[NSData alloc] initWithBase64EncodedString:data options:NSDataBase64DecodingIgnoreUnknownCharacters];
NSLog(@"Length:  %lu", [key length]);
  

Комментарии:

1. Спасибо. Также выяснил причину, по которой это не всегда работает со strlen (), но иногда срабатывает. Мой пример строки в шестнадцатеричном формате — 51D9808E498D42CEFDF89FDAFCC555480091908A. и что 00 в конце — это нулевой ограничитель, поэтому он видел только первые 16 байтов (или фактически символы) с помощью strlen ()

2. да, в некоторых случаях это работает, поэтому будьте осторожны при использовании strlen() с байтами или тестом, я предлагаю использовать length функцию NSData для достижения наилучшего результата.