响应示例:
_STX_<Response>
<Error>Cancelled</Error>
</Response>
_ETX_<AuditCharacter_not_XML>_EOT_
_VAR_
是实际的ASCII十六进制代码(参考)
_STX_ = 0x02 // start of heading
_ETX_ = 0x03 // end of text
_EOT_ = 0x04 // end of transmission
我们正在与一些第三方设备进行一些集成,其中一个我们有一个套接字,可以读取设备的响应。我们使用CocoaAsyncSocket。因此,我们可以将数据用作NSData或NSString
EG:
NSData *strData = [data subdataWithRange:NSMakeRange(0, [data length])];
NSString *msg = [[NSString alloc] initWithData:strData encoding:NSUTF8StringEncoding];
我要做的是在ASCII控制字符之间获取XML。
一种方法是执行以下操作(了解NSString是UTF16)
NSRange rSub = NSMakeRange(1, [msg length] - 5);
NSString *sub = [msg substringWithRange:rSub];
这正确地返回XML,但这是非常有限的,当AuditCharacter超过1个字节/ char时会发生什么。我们应该在两个控件 STX 和 ETX 字符之间获取字符串。
我们尝试了以下
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
这似乎总是返回整个字符串。
然后我们尝试使用范围
NSRange r1 = [msg rangeOfString:[NSString stringWithFormat: @"<%c>", STX]];
NSRange r2 = [msg rangeOfString:[NSString stringWithFormat: @"<%c>", ETX]];
但两个范围总是返回零长度。
我知道这与试图在字符串中拆分/定位控制字符的事实有关,但我不确定为什么这样做是正确的。
任何帮助都将不胜感激。
答案 0 :(得分:0)
您正在使用尖括号搜索字符串<_STX_>
,但您的实际字符串中没有尖括号。只需删除尖括号即可。