Если вы хотите создать подписанный 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
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:
. Это легче, потому что это не требует завершенных пустым указателем данных; это просто использует длину, которую Вы уже имеете. (Не забывайте выпускать или автовыпускать его.)
Это - важный момент, который должен быть повторно подчеркнут, я думаю. Оказывается, что,
NSString *content = [NSString stringWithUTF8String:[responseData bytes]];
не то же как,
NSString *content = [[NSString alloc] initWithBytes:[responseData bytes]
length:[responseData length] encoding: NSUTF8StringEncoding];
, первое ожидает, что ПУСТОЙ УКАЗАТЕЛЬ завершил строку байтов, второе не делает. В вышеупомянутых двух случаях content
будет ПУСТЫМ в первом примере, если строка байтов не будет правильно завершена.
Ага, 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
В случаях, где я не управляю данными, преобразовываемыми в строку, такую как чтение из сети, я предпочитаю использовать NSString -initWithBytes:length:encoding:
так, чтобы я не зависел от завершения ПУСТОГО УКАЗАТЕЛЯ, представляют в виде строки для получения определенных результатов. Обратите внимание, что в документации Apple говорится, не является ли cString завершенной строкой ПУСТОГО УКАЗАТЕЛЯ, что результаты не определены.
Хороший быстрый и грязный подход - использовать инициализатор NSString
stringWithFormat
, чтобы помочь вам. Одной из менее часто используемых функций форматирования строк является возможность указывать максимальную длину строки при выводе строки. Использование этой удобной функции позволяет довольно легко преобразовать NSData
в строку:
NSData *myData = [self getDataFromSomewhere];
NSString *string = [NSString stringWithFormat:@"%.*s", [myData length], [myData bytes]];
Если вы хотите вывести ее в журнал, это может быть еще проще:
NSLog(@"my Data: %.*s", [myData length], [myData bytes]);