Get

2017-02-13 3 views
0

Beispiel Antwort:Get

_STX_<Response> 
    <Error>Cancelled</Error> 
</Response> 
_ETX_<AuditCharacter_not_XML>_EOT_ 

_VAR_ sind tatsächliche ASCII Hex-Codes (Referenz)

_STX_ = 0x02 // start of heading 
_ETX_ = 0x03 // end of text 
_EOT_ = 0x04 // end of transmission 

Wir tun einige Integration mit einigen 3rd-Party-Geräten, einer von ihnen Wir haben einen Sockel, der eine Antwort vom Gerät einliest. Wir verwenden CocoaAsyncSocket für diesen Zweck. So sind die Daten, die uns als NSData oder NSString verfügbar

Beispiel:

NSData *strData = [data subdataWithRange:NSMakeRange(0, [data length])]; 
NSString *msg = [[NSString alloc] initWithData:strData encoding:NSUTF8StringEncoding]; 

Was ich versuche, die XML zwischen den ASCII-Steuerzeichen zu tun ist, zu erhalten.

Eine Möglichkeit, die funktioniert, ist die folgende (Wissen, dass NSString ist ein UTF16) zu tun

NSRange rSub = NSMakeRange(1, [msg length] - 5); 
NSString *sub = [msg substringWithRange:rSub]; 

Diese korrekte XML zurückgibt, aber das ist sehr begrenzt, was passiert, wenn die AuditCharacter mehr als 1 Byte/verkohlen. Wir sollten die Zeichenfolge zwischen den beiden Zeichen STX und ETX Zeichen erhalten.

Wir haben versucht, die folgende

unichar STX = 0x02; // \u0002 Start of Text 
unichar ETX = 0x03; // \u0003 End of Text 
unichar EOT = 0x04; // \u0004 End of transmission 
unichar ACK = 0x06; // \u0006 ACK 
unichar NAK = 0x15; // \u0015 NAK 

NSScanner *scanner = [NSScanner scannerWithString:msg]; 
// Tried as NSString 
NSCharacterSet *seperator = [NSCharacterSet characterSetWithCharactersInString:[NSString stringWithFormat: @"<%c>", ETX]] 
// Tried as NSData 
NSCharacterSet *seperator = [NSCharacterSet characterSetWithBitmapRepresentation:[[NSData alloc] initWithBytes:&ETX length:2]]; // tried length as 1 and 2 

Das scheint immer nur die gesamte Zeichenfolge zurück.

Wir versuchen dann

NSRange r1 = [msg rangeOfString:[NSString stringWithFormat: @"<%c>", STX]]; 
NSRange r2 = [msg rangeOfString:[NSString stringWithFormat: @"<%c>", ETX]]; 

Aber beiden Bereiche Rückkehr immer eine Länge von Null eine Reihe verwenden.

Ich weiß, dass dies mit der Tatsache zu tun hat, dass versucht wurde, die Steuerzeichen in der Zeichenfolge zu splitten, aber ich bin mir nicht sicher, was der richtige Grund dafür wäre.

Jede Hilfe wäre willkommen.

+1

Sie suchen nach der Zeichenfolge '<_STX_>' mit spitzen Klammern, aber Ihre tatsächliche Zeichenfolge hat keine spitzen Klammern dort. Ist das ein Übertragungsfehler oder gibt es einen Grund, warum Sie Klammern hinzugefügt haben? –

+0

Es ist auch unklar, warum -5 in Ihrem Bereich funktioniert, und wie sich dies auf UTF-16 bezieht (es kann intern UTF-16 sein oder nicht und weder 'length' noch' substringWithRange: 'basieren auf internen Repräsentationen). –

+1

Um beide Fragen zu beantworten, sind Sie zu 100% korrekt. Ich habe das Steuerzeichen in <> falsch gesucht. Ich habe so weit zu lange geblickt, um es überhaupt bemerkt zu haben. Reming das <> behebt mein Problem. In Bezug auf die -5 vs -3 kann ich nicht sagen, ursprünglich hatte ich es als -3, aber es würde zusätzliche Zeichen am Ende verlassen. Ich nahm an, weil NSData in NSString konvertiert wurde, machte es die Steuerzeichen 2 Bytes. – Jarratt

Antwort

0

Sie suchen nach der Zeichenfolge <_STX_> mit spitzen Klammern, aber Ihre tatsächliche Zeichenfolge hat keine spitzen Klammern dort. Entfernen Sie einfach die spitzen Klammern.