Я имею:
std::string string = "\xae\xab\xe30"
(после продолжения последовательности \ xe30).
Эти данные поступают из библиотеки echoprint-ios после создания отпечатка для музыкального файла на iOS-устройстве. Эта строка содержит zlib
-сжатый base64
последовательность.
UPD: иногда эта строка может быть с данными, как .$\x18\x8a\x03
и мне нужен твой ответ на это тоже.
Я нуждаюсь:
разобрать эту строку в NSString*
и передать его в NSURL
сделать запрос к сервисам эхопечати.
В чем дело:
Я не могу разобрать NSString*
объект из этого std::string
многими методами:
создание объекта NSString через [NSString stringWithCString:string.c_str() encoding:NSUTF8StringEncoding]
— возвращается nil
на UTF8, что-то вроде того, что мне нужно, но неверные данные с кодировкой с UTF16 / 32 (но это абсолютно неправильно, это должно быть ascii / utf8 string imo), или с NSAsciiStringEncoding это помещает в данные объекта NSString с нечитаемыми символами (как из системы таблица символов).
любой метод, который получает на вход стандартную c-строку (так будет string.c_str()
)
Продолжить:
Мне нужна помощь с переводом этой строки в объект NSString.
std::string string = "\xae\xab\xe30";
NSString * cocoaString = [NSString stringWithFormat:@"%s",string.c_str()];
или же
NSString * cocoaString = [NSString stringWithCString:string.c_str() encoding:NSUTF8StringEncoding];
имейте в виду, что в c ++ вы можете хранить нулевые символы в строке … но это не будет считаться допустимым в NSString, и если вам нужно сохранить произвольные данные, объект NSData будет работать лучше.
пример данных:
NSData * d = [NSData dataWithBytes:(void *) string.c_str() length:string.length()];
это будет инкапсулировать произвольные двоичные данные без учета формата.
После прочтения всех интернет-сайтов, форумов, постов в блогах и т. Д., Я думаю, я нашел причину проблемы, которую я описал выше.
Я не мог поверить, что эта строка верна все время, и я был прав — это мусор.
C ++ объект Codegen
-класс был неверным все время.
Хорошо эту проблему объяснили Вот.
Эту проблему с codegen я решил, изменив класс, чтобы он стал классом Objective-C ++.
Мой форк оригинального примера echoprint-ios Вот. Не стесняйтесь, чтобы получить его и использовать.
Также был отправлен запрос на удаление в родительский репозиторий.
Я забыл проверить очевидное, e30 (16) эквивалентно 3632 (10). Это значение явно больше 256, что может уместиться в 8 байтов. Так что действительно есть ошибка, компилятор прав!