如何访问看起来像数组的 NSData
How to access NSData that looks like array
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 在我显示它们时得到数字,尽管根据 dataArray 它们应该是 0.0。
我真的要开始翻表了,因为我已经解决了所有关于将 NSData 转换为 NSString、String、Integer、Decimal、Hex、Hex String、NSArray 的问题...没有什么能帮助我解决这个问题。
此外,当我每次尝试做类似
的事情时
xPos = round(filter(dataArray[1]))
我得到 0.0。有人可以帮我解决这个问题吗?非常感谢!
请不要引导我到另一个答案,我可以 99.999% 保证我已经看过或尝试过,即使是 objective-C 中写的那些。
你应该知道dataBytes数组的数据类型,然后你要进行相应的转换。
您可以更改以下数据类型 (UInt32) 并在 playground 中进行实验。
注意 - 我已经在 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)")
}
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 在我显示它们时得到数字,尽管根据 dataArray 它们应该是 0.0。
我真的要开始翻表了,因为我已经解决了所有关于将 NSData 转换为 NSString、String、Integer、Decimal、Hex、Hex String、NSArray 的问题...没有什么能帮助我解决这个问题。
此外,当我每次尝试做类似
的事情时xPos = round(filter(dataArray[1]))
我得到 0.0。有人可以帮我解决这个问题吗?非常感谢!
请不要引导我到另一个答案,我可以 99.999% 保证我已经看过或尝试过,即使是 objective-C 中写的那些。
你应该知道dataBytes数组的数据类型,然后你要进行相应的转换。 您可以更改以下数据类型 (UInt32) 并在 playground 中进行实验。
注意 - 我已经在 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)")
}