将NSData的每个字节转换为等效的Int值

时间:2015-10-19 23:12:26

标签: swift

我有一个NSData对象,正在分配字节,表示0-255的无符号整数。将这些字节转换为整数的最简单方法是什么,或者,如果更容易,则转换为字符串/ NSString?

例如,如果我的NSData对象中有字节0x00,0x02和0x0A,那么我希望有一个{0,2,10}的整数数组或字符串/ NSString" 0210&# 34。

似乎有很多方法可以将NSData转换为ASCII NSStrings,UInt8数组等,但我不能在生活中找出如何在Swift中进行这种简单的转换。

编辑:我想要的示例代码:

var data:NSData
/*allocate NSData*/
var unsignedInts = [Int]()
/*Allocate each byte of data to an individual index of unsignedInts */
print(unsignedInts)
//should see {0, 1, 10} if bytes are 0x00, 0x01, and 0x0A

2 个答案:

答案 0 :(得分:2)

有必要创建一个新的Int数组,因为Int每个条目需要更多的字节。

var nsData: NSData = NSData(bytes: [0x00, 0x02, 0x0A] as [UInt8], length: 3)
let buffer = UnsafeBufferPointer<UInt8>(start:UnsafePointer<UInt8>(nsData.bytes), count:nsData.length)
print("nsData: \(nsData)")

var intData = [Int]()
intData.reserveCapacity(nsData.length)

var stringData = String()

for i in 0..<nsData.length {
    intData.append(Int(buffer[i]))
    stringData += String(buffer[i])
}

print("intData: \(intData)")
print("stringData: \(stringData)")

nsData:&lt; 00020a&gt;
intData:[0,2,10]
stringData:0210

答案 1 :(得分:0)

我可以推荐这样的方法:

import Foundation

extension NSData {
    var byteBuffer : UnsafeMutableBufferPointer<UInt8> {
        return UnsafeMutableBufferPointer(start: UnsafeMutablePointer(bytes), count: length)
    }

    var array : [UInt8] {
        return Array(byteBuffer)
    }

    var intArray : [Int] {
        return byteBuffer.map(Int.init)
    }

    var byteString : String {
        return byteBuffer.lazy.map(String.init).joinWithSeparator("")
    }
}

用法:

let data1 = NSData(bytes: [0x48, 0xa1, 0x95, 0xe, 0x1c, 0x38, 0x82] as [UInt8], length: 7)       // <48a1950e 1c3882>

print(data1.array)       // "[72, 161, 149, 14, 28, 56, 130]"
print(data1.intArray)    // "[72, 161, 149, 14, 28, 56, 130]"
print(data1.byteString)  // "72161149142856130"

let data2 = NSData(bytes: [0x00, 0x02, 0x0A] as [UInt8], length: 3)

print(data2.array)       // "[0, 2, 10]"
print(data2.intArray)    // "[0, 2, 10]"
print(data2.byteString)  // "0210"

非常简单,快捷,高效,就像这样。

请注意,在某些情况下,您实际上并不需要这样的数组,因为您可以以相同的方式访问数据的所有值而无需分配新数组(推荐):

data1.byteBuffer[4]      // 28
data1.byteBuffer.count   // 7
data1.byteBuffer(14)     // 3

编辑:我添加了一个返回Int数组的属性,但我找不到您需要它的原因