如何访问看起来像数组的NSData

时间:2015-08-11 06:13:03

标签: ios arrays swift nsdata

    let dataBytes = characteristic.value
    let dataLength = dataBytes.length
    var dataArray = [Double](count: 4, repeatedValue: 0.0)
    dataBytes.getBytes(&dataArray, length: dataLength)

    func filter(acceleration : Double) -> Double{
        dir = (acceleration * HIGHPASS_FILTER) + (dir * (1.0 - HIGHPASS_FILTER))
        return Double(acceleration - dir)
    }

    xPos = filter(dataArray[1])
    yPos = filter(dataArray[2])
    zPos = filter(dataArray[3])

这是我的Swift代码。我的问题是dataBytes打印出来:

<5fb9f940 f940fe00 fe002000 2000> 
<60b9f940 f940fe00 fe402000 2000>
<61b9f980 f980fe00 fe002000 2000> 
<67b9f940 f980fe00 fe002000 2000>
<68b9f980 f980fe00 fe002000 2000>

但是dataArray打印出来:

[6.89325535931183e-304, 6.79049015671387e-313, 0.0, 0.0]
[123919.578362877, 6.79049015671387e-313, 0.0, 0.0]
[6.89325535931183e-304, 6.79049015671387e-313, 0.0, 0.0]
[6.89325535931183e-304, 6.79049015671387e-313, 0.0, 0.0]
[6.89325535931183e-304, 6.79049015671387e-313, 0.0, 0.0]
[6.89325622848131e-304, 6.79049015671387e-313, 0.0, 0.0]

我不明白为什么数组没有从NSData复制值,yPos和zPos在我显示它们时会得到数字,即使它们应该是0.0根据dataArray。

我真的要开始翻表,因为我已经完成了关于将NSData转换为NSString,String,Integer,Decimal,Hex,Hex String,NSArray的所有问题......没有什么能帮助我解决这个问题。

此外,每当我尝试做一些像

这样的事情时
xPos = round(filter(dataArray[1]))

我得到0.0。任何人都可以帮我解决这个问题吗?我非常感激!

请不要指导我另一个答案,我可以99.999%保证我已经看过或尝试过,即使是用Objective-C写的。

1 个答案:

答案 0 :(得分:0)

您应该知道dataBytes数组的数据类型,然后您必须相应地进行转换。 您可以更改以下数据类型(UInt32)并在游乐场中进行实验。

注意 - 我在Xcode 7 beta 4游乐场尝试了以下代码。

var arr : [UInt32] = [32,4,123,4,5,2];

let dataBytes = NSData(bytes: arr, length: arr.count * sizeof(UInt32))

// let dataBytes = characteristic.value
let dataLength = dataBytes.length
var dataArray = [UInt32](count: 4, repeatedValue: 0)
dataBytes.getBytes(&dataArray, length: dataLength)

let xPos = UInt32(dataArray[0])
let yPos = UInt32(dataArray[1])
let zPos = UInt32(dataArray[2])
print("\(xPos) \(yPos) \(zPos)");

对于多数据类型数组

import Foundation

var arr = [32,4,4,5,2,"KP"];

let dataBytes = NSData(bytes: arr, length: arr.count * sizeof(AnyObject))

// let dataBytes = characteristic.value
let dataLength = dataBytes.length
var dataArray = [AnyObject](count: 6, repeatedValue: 0)
dataBytes.getBytes(&dataArray, length: dataLength)
let xPos: (AnyObject) = dataArray[0]
let yPos: (AnyObject) = dataArray[1]
let zPos: (AnyObject) = dataArray[5]
print("\(xPos) \(yPos) \(zPos)");

您可以使用以下代码

来识别数据类型
if let string = x as? String //Int,Float...
{
  print("I'm a string: \(string)")
}