2017-02-13 52 views
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個字節會發生什麼/焦炭。我們應該得到兩個控件STXETX字符之間的字符串。

我們曾嘗試以下

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

您正在使用尖括號搜索字符串'<_STX_>',但實際的字符串沒有尖括號。這是一個抄寫錯誤還是有你添加括號的原因? –

+0

目前還不清楚爲什麼-5在你的範圍內工作,以及這與NSString是UTF-16(它可能是也可能不是UTF-16內部的,也不是基於內部表示的「length」和「substringWithRange: )。 –

+1

爲了回答你的問題,你是100%正確的,我錯誤地搜索了內部控制字符<>。我一直盯着這麼久才發現。重寫<>解決了我的問題。 關於-5 vs -3,我不能告訴你,原來我把它當作-3,但最終會留給額外的字符。我假設因爲將NSData轉換爲NSString它使控制字符2個字節。 – Jarratt

回答

0

您正在使用尖括號搜索字符串<_STX_>,但實際的字符串沒有尖括號。只要刪除尖括號。

相關問題