Konvertiere NSData Bytes in NSString?
Ich versuche, die BEncoding ObjC Klasse zum decodieren einer .torrent
Datei.
NSData *rawdata = [NSData dataWithContentsOfFile:@"/path/to/the.torrent"];
NSData *torrent = [BEncoding objectFromEncodedData:rawdata];
Wenn ich NSLog
torrent
bekomme ich die folgende:
{
announce = <68747470 3a2f2f74 6f727265 6e742e75 62756e74 752e636f 6d3a3639 36392f61 6e6e6f75 6e6365>;
comment = <5562756e 74752043 44207265 6c656173 65732e75 62756e74 752e636f 6d>;
"creation date" = 1225365524;
info = {
length = 732766208;
name = <7562756e 74752d38 2e31302d 6465736b 746f702d 69333836 2e69736f>;
"piece length" = 524288;
....
Wie konvertiere ich die name
in einen NSString? Ich habe versucht..
NSData *info = [torrent valueForKey:@"info"];
NSData *name = [info valueForKey:@"name"];
unsigned char aBuffer[[name length]];
[name getBytes:aBuffer length:[name length]];
NSLog(@"File name: %s", aBuffer);
..die retrives die Daten, scheint aber noch weitere unicode-Müll nach:
File name: ubuntu-8.10-desktop-i386.iso)
Habe ich auch schon versucht (von hier aus)..
NSString *secondtry = [NSString stringWithCharacters:[name bytes] length:[name length] / sizeof(unichar)];
..aber dies scheint, um wieder eine Reihe von zufälligen Zeichen:
扵湵畴㠭ㄮⴰ敤歳潴⵰㍩㘸椮潳
Die Tatsache, dass die erste Möglichkeit (wie bereits in der Apple-Dokumentation) liefert die meisten Daten korrekt, mit einigen zusätzlichen bytes, macht mich denke, es könnte sich um einen Fehler in der BEncoding Bibliothek.. aber mein Mangel an wissen über ObjC ist eher bei Störung.
InformationsquelleAutor der Frage dbr | 2009-02-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wäre ein NSDictionary, dann nicht ein NSData.
Nein, es abgerufen, die mit dem Namen nur in Ordnung, einfach ausgedruckt, ist es falsch.
%s
nimmt einen C-string null-terminiert ist; die bytes des Daten-Objekts nicht null-terminiert ist (Sie sind einfach nur bytes, die nicht unbedingt Zeichen in jeder Kodierung und 0—die null ist wie ein Charakter—ist ein perfekt gültiges byte). Sie müssten einen mehr Charakter, und setzen Sie den letzten im array auf 0:Aber null-Terminierung der Daten in ein NSData-Objekt falsch ist (außer, wenn Sie wirklich benötigen eine C-Zeichenfolge). Ich werde auf den richtigen Weg in einem Augenblick.
Weil deine bytes sind UTF-8, welches wiederum in einem Zeichen (in der Regel) ein byte.
unichar
ist, undstringWithCharacters:length:
akzeptiert, UTF-16. In dieser Codierung eines Zeichens (in der Regel) zwei bytes. (Daher der division durchsizeof(unichar)
: er teilt die Anzahl der bytes, die durch 2, um die Anzahl der Zeichen.)So dass Sie sagten, "hier ist einige UTF-16-Daten", und es ging hin und machte Zeichen aus jeder zwei bytes; jedes paar von bytes sein sollte, war zwei Zeichen, die nicht ein, so hast du Müll (die sich meist CJK-Ideogramme).
Sie beantwortet Ihre eigene Frage ziemlich gut, außer, dass
stringWithUTF8String:
ist einfacher alsstringWithCString:encoding:
für UTF-8-kodierte strings.Jedoch, wenn Sie die Länge (wie Sie tun, wenn Sie haben ein NSData), ist es sogar noch einfacher—und richtig—zu verwenden
initWithBytes:length:encoding:
. Es ist einfacher, weil es nicht erforderlich, null-terminierte Daten; Sie verwendet einfach die Länge, die Sie bereits haben. (Vergessen Sie nicht, zu release oder autorelease.)InformationsquelleAutor der Antwort Peter Hosey
Das ist ein wichtiger Punkt, sollte erneut betont, denke ich. Es stellt sich heraus, dass
ist nicht das gleiche wie,
die erste erwartet einen NULL-terminierten byte-string, der zweite nicht. In den beiden oben genannten Fällen
content
NULL im ersten Beispiel, wenn die byte-Zeichenkette nicht korrekt terminiert.InformationsquelleAutor der Antwort Alasdair Allan
Wie etwa
InformationsquelleAutor der Antwort user102008
Einen schönen quick-and-dirty Ansatz ist die Verwendung von
NSString
'sstringWithFormat
Initialisierer, um Ihnen zu helfen. Einer der weniger Häufig verwendeten Funktionen der string-Formatierung ist die Möglichkeit anzugeben, ein mximum string-Länge, wenn die Ausgabe von einem string. Über diese praktische Funktion ermöglicht es Ihnen, zu konvertierenNSData
in einen string ganz einfach:Wenn Sie wollen, geben Sie zum anmelden, kann es sogar noch einfacher:
InformationsquelleAutor der Antwort Ethan
Aha, die
NSString
MethodestringWithCString
korrekt funktioniert:Mit der
bencoding.h/.m
Dateien zu Ihrem Projekt Hinzugefügt, das komplette.m
Datei:..und die Ausgabe:
InformationsquelleAutor der Antwort dbr
In Fällen, In denen ich nicht die Kontrolle über die Daten wird umgewandelt in einen string, wie das Lesen aus dem Netz, die ich lieber verwenden
NSString -initWithBytes:length:encoding:
so, ich bin nicht angewiesen auf eine mit NULL beendete Zeichenfolge, um definierte Ergebnisse. Beachten Sie, dass die Dokumentation von Apple sagt, wenn cString ist nicht eine mit NULL beendete Zeichenfolge, dass die Ergebnisse undefiniert sind.InformationsquelleAutor der Antwort Jay O'Conor
Verwenden Sie eine Kategorie auf NSData:
NSData+NSString.h
NSData+NSString.m
Dann nur
NSLog(@"Data is %@", [nsData toString])"
InformationsquelleAutor der Antwort DefenestrationDay
Können Sie versuchen, diese. Es gut mit mir
InformationsquelleAutor der Antwort user2652623
Manchmal müssen Sie zum erstellen von Base64-kodierten string aus NSData. Zum Beispiel, wenn Sie erstellen ein e-mail-MIME. In diesem Fall verwenden Sie die folgenden:
InformationsquelleAutor der Antwort wzbozon
Denke ich, sollten Sie versuchen, diesen code, weil ich habe es verwendet und es wird funktionieren.
InformationsquelleAutor der Antwort MobilePundits