экранированный std :: string в NSString *

Я имею:

std::string string = "\xae\xab\xe30" (после продолжения последовательности \ xe30).

Эти данные поступают из библиотеки echoprint-ios после создания отпечатка для музыкального файла на iOS-устройстве. Эта строка содержит zlib-сжатый base64 последовательность.

UPD: иногда эта строка может быть с данными, как .$\x18\x8a\x03 и мне нужен твой ответ на это тоже.

Я нуждаюсь:

разобрать эту строку в NSString* и передать его в NSURL сделать запрос к сервисам эхопечати.

В чем дело:

Я не могу разобрать NSString* объект из этого std::string многими методами:

  1. создание объекта NSString через [NSString stringWithCString:string.c_str() encoding:NSUTF8StringEncoding] — возвращается nil на UTF8, что-то вроде того, что мне нужно, но неверные данные с кодировкой с UTF16 / 32 (но это абсолютно неправильно, это должно быть ascii / utf8 string imo), или с NSAsciiStringEncoding это помещает в данные объекта NSString с нечитаемыми символами (как из системы таблица символов).

  2. любой метод, который получает на вход стандартную c-строку (так будет string.c_str())

Продолжить:

Мне нужна помощь с переводом этой строки в объект NSString.

1

Решение

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()];

это будет инкапсулировать произвольные двоичные данные без учета формата.

2

Другие решения

После прочтения всех интернет-сайтов, форумов, постов в блогах и т. Д., Я думаю, я нашел причину проблемы, которую я описал выше.

Я не мог поверить, что эта строка верна все время, и я был прав — это мусор.
C ++ объект Codegen-класс был неверным все время.

Хорошо эту проблему объяснили Вот.

Эту проблему с codegen я решил, изменив класс, чтобы он стал классом Objective-C ++.
Мой форк оригинального примера echoprint-ios Вот. Не стесняйтесь, чтобы получить его и использовать.

Также был отправлен запрос на удаление в родительский репозиторий.

1

Я забыл проверить очевидное, e30 (16) эквивалентно 3632 (10). Это значение явно больше 256, что может уместиться в 8 байтов. Так что действительно есть ошибка, компилятор прав!

0
По вопросам рекламы [email protected]