2016-07-21 180 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

回答