获取两个ASCII控制字符之间的子字符串

时间:2017-02-13 13:30:09

标签: ios objective-c

响应示例:

_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]];

但两个范围总是返回零长度。

我知道这与试图在字符串中拆分/定位控制字符的事实有关,但我不确定为什么这样做是正确的。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

您正在使用尖括号搜索字符串<_STX_>,但您的实际字符串中没有尖括号。只需删除尖括号即可。

相关问题