0
示例響應:兩個ASCII控制字符之間獲取子
_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是UTF-16)
NSRange rSub = NSMakeRange(1, [msg length] - 5);
NSString *sub = [msg substringWithRange:rSub];
這正確返回XML,但這是非常有限的,當AuditCharacter超過1個字節會發生什麼/焦炭。我們應該得到兩個控件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]];
嘗試,但兩者的範圍總是返回長度爲零。
我知道這與試圖在字符串中分隔/定位控制字符的事實有關,但我不確定正確的原因是什麼。
任何幫助,將不勝感激。
您正在使用尖括號搜索字符串'<_STX_>',但實際的字符串沒有尖括號。這是一個抄寫錯誤還是有你添加括號的原因? –
目前還不清楚爲什麼-5在你的範圍內工作,以及這與NSString是UTF-16(它可能是也可能不是UTF-16內部的,也不是基於內部表示的「length」和「substringWithRange: )。 –
爲了回答你的問題,你是100%正確的,我錯誤地搜索了內部控制字符<>。我一直盯着這麼久才發現。重寫<>解決了我的問題。 關於-5 vs -3,我不能告訴你,原來我把它當作-3,但最終會留給額外的字符。我假設因爲將NSData轉換爲NSString它使控制字符2個字節。 – Jarratt