Преобразовать байты NSData в NSString?

Если вы хотите создать подписанный APK (подписанный apk, используемый для Android APK, поэтому я думаю, что вы хотите создать APK), вам сначала нужно создать пакет. Если вы уже создали его, дайте мне знать команду, которую вы использовали, а также просто поделитесь снимком экрана со структурой вашего проекта, и он также покажет путь к вашему основному файлу индекса и папке ресурсов Android, а затем я дам вам команду. На данный момент вы просто.

Если не использовать приведенные ниже команды.

Android

реактивный пакет --entry-file index.js --platform android --dev false --bundle-output ./android/app/src/main/assets/ index.android.bundle --assets-dest ./android/app/src/main/res/

iOS (это создает пакет самостоятельно, но если нет, используйте приведенную ниже команду)

[ 115] реактивный пакет --entry-file index.js --platform ios --dev false --bundle-output main.jsbundle

Пожалуйста, дайте мне знать, если какая-либо команда не Работая, то потребуется модификация. Если это сработает, вам нужно проверить, будет ли создан новый файл с именем main.jsbundle

49
задан Matt Joiner 10 September 2014 в 17:15
поделиться

5 ответов

NSData *torrent = [BEncoding objectFromEncodedData:rawdata];

, Когда я поток NSLog я получаю следующее:

{
    ⋮
}

, Который был бы NSDictionary, затем, не NSData.

unsigned char aBuffer[[name length]];
[name getBytes:aBuffer length:[name length]];
NSLog(@"File name: %s", aBuffer);

.. какой retrives данные, но, кажется, имеет дополнительный unicode мусор после него:

File name: ubuntu-8.10-desktop-i386.iso)

нет, это получило имя файла очень хорошо; Вы просто распечатали его неправильно. %s берет струну до, которая завершается пустым указателем; байты объекта данных не завершаются пустым указателем (они - просто байты, не обязательно символы в любом кодировании и 0—, который является пустым, поскольку character— является совершенно допустимым байтом). Необходимо было бы выделить еще один символ и установить последний в массиве к 0:

size_t length = [name length] + 1;
unsigned char aBuffer[length];
[name getBytes:aBuffer length:length];
aBuffer[length - 1] = 0;
NSLog(@"File name: %s", aBuffer);

, Но завершение пустого указателя данные в объекте NSData являются неправильными (кроме тех случаев, когда Вы действительно делаете , нуждаются в струне до). Я доберусь до правильного пути через мгновение.

я также попробовал [†¦]..

NSString *secondtry = [NSString stringWithCharacters:[name bytes] length:[name length] / sizeof(unichar)];

.. но это, кажется, возвращает случайные китайские символы:

扵湵畴㠭ㄮⴰ敤歳潴⵰㍩㘸椮潳

Поэтому Ваши байты являются UTF-8, который кодирует один символ в (обычно) одном байте.

unichar, и stringWithCharacters:length: принимает, UTF-16. В том кодировании один символ - (обычно) два байта. (Следовательно подразделение [1 110]: это делит число байтов 2 для получения количества символов.)

, Таким образом, Вы сказали, что некоторый UTF-16 “here data”, и это пошло и сделало символы из каждых двух байтов; каждая пара байтов, как предполагалось, была двумя символами, не один, таким образом, Вы получили мусор (который оказался главным образом идеограммами CJK).

<час>

Вы ответили на свой собственный вопрос вполне прилично, за исключением того, что stringWithUTF8String: более просто, чем [1 112] для строк UTF-8-encoded.

Однако, когда у Вас есть длина (как Вы делаете, когда у Вас есть NSData), это даже easier— и больше proper— для использования initWithBytes:length:encoding:. Это легче, потому что это не требует завершенных пустым указателем данных; это просто использует длину, которую Вы уже имеете. (Не забывайте выпускать или автовыпускать его.)

19
ответ дан Community 7 November 2019 в 11:18
поделиться

Это - важный момент, который должен быть повторно подчеркнут, я думаю. Оказывается, что,

NSString *content = [NSString stringWithUTF8String:[responseData bytes]];

не то же как,

NSString *content = [[NSString alloc]  initWithBytes:[responseData bytes]
              length:[responseData length] encoding: NSUTF8StringEncoding];

, первое ожидает, что ПУСТОЙ УКАЗАТЕЛЬ завершил строку байтов, второе не делает. В вышеупомянутых двух случаях content будет ПУСТЫМ в первом примере, если строка байтов не будет правильно завершена.

99
ответ дан Alasdair Allan 7 November 2019 в 11:18
поделиться

Ага, NSString метод stringWithCString работы правильно:

С эти bencoding.h/.m файлы, добавленные к Вашему проекту, полное .m файл:

#import <Foundation/Foundation.h>
#import "BEncoding.h"

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // Read raw file, and de-bencode
    NSData *rawdata = [NSData dataWithContentsOfFile:@"/path/to/a.torrent"];
    NSData *torrent = [BEncoding objectFromEncodedData:rawdata];

    // Get the file name
    NSData *infoData = [torrent valueForKey:@"info"];
    NSData *nameData = [infoData valueForKey:@"name"];
    NSString *filename = [NSString stringWithCString:[nameData bytes] encoding:NSUTF8StringEncoding];
    NSLog(@"%@", filename);

    [pool drain];
    return 0;
}

.. и вывод:

ubuntu-8.10-desktop-i386.iso
6
ответ дан dbr 7 November 2019 в 11:18
поделиться

В случаях, где я не управляю данными, преобразовываемыми в строку, такую как чтение из сети, я предпочитаю использовать NSString -initWithBytes:length:encoding: так, чтобы я не зависел от завершения ПУСТОГО УКАЗАТЕЛЯ, представляют в виде строки для получения определенных результатов. Обратите внимание, что в документации Apple говорится, не является ли cString завершенной строкой ПУСТОГО УКАЗАТЕЛЯ, что результаты не определены.

2
ответ дан Jay O'Conor 7 November 2019 в 11:18
поделиться

Хороший быстрый и грязный подход - использовать инициализатор NSString stringWithFormat , чтобы помочь вам. Одной из менее часто используемых функций форматирования строк является возможность указывать максимальную длину строки при выводе строки. Использование этой удобной функции позволяет довольно легко преобразовать NSData в строку:

NSData *myData = [self getDataFromSomewhere];
NSString *string = [NSString stringWithFormat:@"%.*s", [myData length], [myData bytes]];

Если вы хотите вывести ее в журнал, это может быть еще проще:

NSLog(@"my Data: %.*s", [myData length], [myData bytes]);
7
ответ дан 7 November 2019 в 11:18
поделиться