2016-11-24 58 views
0

我要存储的数据对象的MongoDB:如何从MongoDB存储和检索Swift Data或NSData?

它使用CryptoSwift

let bytes = dataString.utf8.map({$0}) 
let encrypted = try! ChaCha20(key: getAESP(), iv: "zzzzzzzzzzzzzz").encrypt(bytes) 
let encryptedData = Data(bytes: encrypted) 

使用NSURLSession创建并发送到服务器:

let postData = NSMutableData(data: "patient_id=\(patientID)".data(using: String.Encoding.utf8)!) 
postData.append("&data=".data(using: String.Encoding.utf8)!) 
postData.append(encryptedData)   
let request = NSMutableURLRequest(url: NSURL(string: "\(url)api/patient/document")! as URL, 
              cachePolicy: .useProtocolCachePolicy, 
              timeoutInterval: 10.0) 

在我的模型方案,我所描述的数据作为缓冲区:

var DocumentSchema1 = new Schema({ 
     created_at:Date, 
     created_by:String, 
     document_type:String, 
     document_name:String, 
     data: Buffer, 
     modifications: [ 
      { 
       modified_by: String, 
       modified_at: Date, 
       data: Buffer 
      } 
     ], 
     isDeleted: Boolean, 
     deleted_at: String, 
     deleted_by: String, 
    }) 

问题wi这种方法是从Web服务返回的JSON是一种不是Data的缓冲区,下面的Swift条件永远不会被执行。

if let dataString = dict["data"] as? Data{ 

问题是如何从Mongo中获取二进制数据并在Swift中使用它?

EDIT2:立足zaph的回答是: 所以数据都是__NSArrayI的元素的Int64(35) 我可以投的唯一方法是Array<AnyObject>但我不能将其转换为给定的这种形式的数据。

它转换为这些尝试:

  • Array<Int64>
  • [UINT64]
  • [UINT8]
  • [Int64类型]
  • UnsafeRawPointer

失败。

if let a = dataDict["data"] as? Array<Int64> 
+0

提示:如果使用AES从公共的密码加密速度伴随着更快的规模。 – zaph

+0

尝试'init(字节:UnsafeRawPointer,count:Int)'从字节创建一个'Data'对象。 – zaph

+0

我如何得到UnsafeRawPointer?请检查更新的问题。 –

回答

0

假设dataString是一个字节数组,其严重命名:

let dataString :[UInt8] = [0x41, 0x42, 0x43, 0x44] 
print("dataString: \(dataString)") 
let data = Data(bytes:dataString, count:4) 
print("data: \(data)") 
print("data as hexadecimal: \(data.map { String(format: "%02hhx", $0) }.joined())") 

输出:

dataString: [65, 66, 67, 68] 
data: 4 bytes 
data as hexadecimal: 41424344 
+0

谢谢zaph。我仍然在努力。你能看看我最近的编辑吗?我今晚才看到你的答案,我的通知必须关闭。 –