2013-10-01 34 views
0

我從存儲在NSData對象中的藍牙LE外設檢索unix時間戳。如果我將NSData對象的內容打印到調試控制檯,它們看起來是正確的,但是如果我嘗試將NSData對象轉換爲整數值,整數值似乎不斷變化。Obj-C/iOS:如何檢索NSData的內容並進行交互?

NSData *refinedData = [mfrData subdataWithRange:range];

其中產量386d5e9a的調試控制檯上的價值。

我然後轉換爲整數:

uint32_t unixTimeStamp = refinedData;

最初,這會產生的342162144調試控制檯上的值。但是,儘管NSData沒有改變,但這個值仍然在增長。任何人都可以幫助我理解發生了什麼?

如果它不是很明顯,我是一個新手。

謝謝。

+0

386d5e9a看起來像是我的內存地址。你有沒有試過將數據轉換爲CString並打印出來,這可能會解決這個問題。你在調試控制檯中如何生成該值?使用NSLog? – Bergasms

+0

我通過使用NSLog得到它,但是,我確定它是我追求的價值,b/c我在設備上硬編碼它(用於測試目的)。 – user2836698

+0

無論如何,我看到你得到了答案。快樂編碼:) – Bergasms

回答

1

refinedData是一個指向NSData實例的指針。你想訪問其內容:

uint32_t unixTimeStamp = *(uint32_t *)[refinedData bytes]; 

注意,這是簡化的,並假定通過藍牙外設返回的字節是相同的字節順序在設備中的處理器,即range是正確的,等

+0

感謝您的回覆安德魯。這可能是一個愚蠢的基本問題,但在下面的圖片中,是16e5b718的內存地址還是386d5e9a的內容還是反過來呢?http://www.flickr.com/photos/chrisdurst/10060253855/ 如果我使用安德魯的方法,然後unixTimeStamp = 16e5b718。 – user2836698

+0

Doh!我的回答有錯誤。在將它轉換爲指向'uint32_t'的指針之後,您需要取消引用字節指針。我已經修復了代碼。使用前面的(不正確)代碼,unixTimeStamp將成爲refinedData內容第一個字節的內存地址。你需要由refinedData本身包含的字節,所以你需要取消引用該指針(地址)。用我更新的答案再試一次。 –

+0

輝煌。謝謝,那有效。我所要做的就是交換序列號,它像一種享受。我欠你一杯啤酒。謝謝。 – user2836698