2012-06-09 15 views
2

我有不同的NSData流向我的班級。其中一些可能是rtf格式的字符串。現在我已經發現了(希望正確),所有RTF格式的字符串與如何測試特定字節值的NSData(a.k.a.頭)

data: <7b5c7274 66315c61 and then random other data ....> 

現在我需要能夠有一個測試,看看是否開始前8個字節任何給定的NSData的未來我的方式等於( 7b5c7274 66315c61)。所以我想這個問題是雙重的:

  1. 如何存放用於測試目的(7b5c7274 66315c61)值

  2. 我怎麼測試它反對任何給定的NSData

謝謝!

回答

2

RTF是一種基於文本的文件格式。那些來自NSData的值對應於「{\ rtf1 \ a」,其中「\ a」是「\ ansi」的開頭。就個人而言,我只是測試前5個字節匹配「{\ rtf」。這就是file命令的「magic」文件用作其測試。見/usr/share/file/magic/rtf

由於匹配文本是純ASCII,因此可以使用NSString* theString = [[NSString alloc] initWithBytes:[theData bytes] length:MIN([theData length], 5) encoding:NSASCIIStringEncoding],然後使用[theString isEqualToString:@"{\\rtf"]。如果數據不是ASCII,那麼解碼將失敗,並且theString將爲nil,並且相等性測試將給出錯誤(因爲消息傳遞nil返回零),這正是您想要的。

+0

對不起,使用'MIN'而不是'min'。我編輯了答案。 –

+0

謝謝。我得到了與MIN不同的錯誤(比較不同符號類型的(ID長度)aka無符號整數和5 aka類型)。但沒關係。我只會在使用測試前測試數據長度是否至少爲5 – TrekOnTV2017

3

您可以撥打getBytes:length:,傳遞一個八字節的緩衝區,然後測試您找回的結果。

把一個rtf文件放入NSData,得到前八個字節,將它們打印出來,並將這些常量放在程序中的一個字節數組中。然後將該數組與getBytes:length:使用memcmp返回的八個字節進行比較。

+0

謝謝。如果其他事情失敗,我可能會嘗試。我在C/C++上並不是很大,所以我猜是最後一招。但非常感謝您提供可能的解決方案。 – TrekOnTV2017