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.
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? –
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). –
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