2016-05-14 17 views
0

Ich habe diesen Code unten, dass die Antwort von meinem Server mit Sockets senden Griffe:NSLog zeigen seltsame Zeichen anstelle des JSON

uint8_t buffer[4096]; 
     int len; 
     NSMutableString *total = [[NSMutableString alloc] init]; 
     while ([inputStream hasBytesAvailable]) { 
      len = (int)[inputStream read:buffer maxLength:sizeof(buffer)]; 
      if (len > 0) { 

       NSLog(@"Buffer: %s",buffer); 
       [total appendString: [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding]]; 
       NSLog(@"Receive: %@, len: %d",total,len); 
       NSLog(@"len: %d, receive: %@",len,total); 

} 

} 

Mein Server eine Textdatei wie folgt an:

[{"name_user":"stack overflow","user_key":"XXXXXXX","type":21}] 

Das Problem mit diesem Code ist, wenn ich dieses JSON sende, zeigt das Konsolenprotokoll die Länge dieses JSON an. Aber wenn ich sende dieses JSON unter:

[[{"name_user":"stack overflow","user_key":"XXXXXXX","type":21}],[{"name_user":"lacrifilm","user_key":"XXXXXXX","type":21}]] 

, dass zwei Werte in JSON repräsentiert das Konsolenprotokoll zeigt:

Buffer: ~ 
Receive: ~ 
len: 184, receive: ~ 

ich glaube, das Problem ist nicht in meinem Server, denn wenn ich es ist, wäre bekommen: Receive: ~, len: 184, anstelle von Receive: ~ ohne len: 184 wie wir im zweiten Aufruf von NSLog in meinem Befehl oben gesehen haben.

Wie kann ich dieses Problem lösen?

+0

Mögliche Duplikat von [Warum nicht Arbeit von NSData zu String? Swift] (http://stackoverflow.com/questions/36894972/why-doesnt-cast-work-from-nsdata-to-string-swift) – Larme

Antwort

2

Sie bauen Ihre Zeichenfolge falsch auf. Sie lesen eine Reihe von Bytes, nicht Teile einer Zeichenfolge. Erstellen Sie also eine NSMutableData, und erstellen Sie dann eine NSString, sobald Sie alle Daten haben. Mehr wie dies:

uint8_t buffer[4096]; 
NSMutableData *data = [[NSMutableData alloc] init]; 
while ([inputStream hasBytesAvailable]) { 
    NSInteger len = [inputStream read:buffer maxLength:sizeof(buffer)]; 
    if (len > 0) { 
     //NSLog(@"Buffer: %s",buffer); // can't do this - buffer isn't a null-terminated C-string 
     [data appendBytes:buffer length:len]; 
     NSLog(@"Receive: %@, len: %d", data, (int)len); 
    } 
} 

NSString *total = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
NSLog(@"Total: %@", total); 
+0

Es funktioniert, ich kann den Hash von NSData sehen, aber der NSString total wird zurückgegeben 'null', ich glaube, wenn ich es in ein NSArray umwandel, kann ich die Werte richtig sehen? – Lacrifilm

+2

Wenn "total" "nil" ist, aber "data" scheint die richtige Menge an Daten zu haben, dann ist die Zeichenfolge möglicherweise nicht in UTF-8-Codierung. Wissen Sie, welche Zeichenfolge für die Codierung Ihres Servers verwendet wird? – rmaddy

+2

Und wenn Sie tatsächlich NSJSONSerialization verwenden, müssen Sie keine Zeichenfolge erstellen. Übergeben Sie einfach "Daten" direkt. Dies funktioniert jedoch nur, wenn 'NSData' eine Zeichenkette ist, die in einer von 5 spezifischen Kodierungen codiert ist (siehe die Dokumente). – rmaddy