2016-07-21 228 views
1

我做了一個應用程序與藍牙低能量設備通信。 基本上,我的應用程序和這個設備有自己的消息語法。它們以字節交換數據,並且數據中的每個值都相反。Swift NSData getBytes顛倒

我的問題是,在逆向返回值後,當我將3個字節的值轉換爲Int32時,NSData.getBytes函數似乎扭轉了該值,所以我得到了錯誤的值。例如:

var value; // containing [ 0x01, 0xD3, 0x00 ] 
value = value.reverse(); // Reverse back : [ 0x00, 0xD3, 0x01 ] 
let numb = value.getUInt32(); // Numb will be 119552, instead of 54017... 

我不知道我的問題是否足夠清楚,但這是我的代碼。反轉數據然後嘗試將數據轉換爲int的函數。

// Those functions are in an extension of NSData 
func getRUInt32(range:NSRange) -> UInt32 
{ 
    var data = message.subdataWithRange(range); // Extract data from main message 
    data = data.reverse(); // Reverse back data 
    return data.getUInt32(); // Convert to UInt32 
} 

func getUInt32() -> UInt32 
{ 
    var value:Int32 = 0; 
    getBytes(&value, length: self.length); 
    return UInt32(value); 
} 

func reverse() -> NSData 
{ 
    let count:Int = length/sizeof(UInt8); 
    var array = [UInt8](count: count, repeatedValue: 0); 
    getBytes(&array, length: count * sizeof(UInt8)); 

    var reversedArray = [UInt8](count: count, repeatedValue: 0); 
    for index in 0..<array.count 
    { 
     reversedArray[index] = array[array.count - index - 1]; 
    } 

    return NSData(bytes: reversedArray, length: reversedArray.count); 
} 
+0

我不明白你的'getUInt32',你爲什麼要將本地值定義爲'Int32'而不是'UInt32'?另外,是否有可能只是在尋找'Int'類型所具有的'.bigEndian'和'.littleEndian'? – hnh

+0

帶有UInt32的getBytes似乎有問題。我已經看到一些錯誤的值,並且這個問題沒有發生,因爲我是這樣轉換的。但也許我錯了。這就是我來這裏的原因。我希望它能正常工作:( – Kyu

回答