2017-06-14 116 views
2

你好我是swift新手,想将字节数组转换为多个整数。在Java中我已经写工作代码,但我不太清楚如何把它带到迅速Swift将字节数组转换为整数

byte[] codeData = Base64.decode(codeDataBase64, 0); 
    ByteArrayInputStream bais = new ByteArrayInputStream(codeData); 
    DataInputStream dis = new DataInputStream(bais); 

    byte version = dis.readByte(); 
    if (version == 1) { 
     int anID = dis.readInt(); 
     int anotherID = dis.readInt(); 
     byte[] TK = new byte[512]; 
     int readTK = dis.read(TK); 
     if (readTK == TK.length) { 
      Log.e("photoConnect success", "anID=" + anID + ", anotherID=" + anotherID + ", TK.length=" + TK.length); 

这是我在斯威夫特迄今:

func base64ToByteArray(base64String: String) -> [UInt8]? { 
    if let nsdata = NSData(base64Encoded: base64String) { 
     var bytes = [UInt8](repeating: 0, count: nsdata.length) 
     nsdata.getBytes(&bytes, length: nsdata.length) 
     return bytes 
    } 
    return nil // Invalid input 
} 

此功能需要一个数组的字节,但我不确定用什么Swift类模仿DataInputStream在Java中的行为。

+0

@HovercraftFullOfEels请参阅我的更新问题,其中包括我的尝试和现在卡在哪里。如果我的第一个问题不够具体,我很抱歉。如果你能指出我正确的方向,我会非常感激。 – Alec

+0

这可能会有所帮助:https://stackoverflow.com/questions/38060682/idiomatic-method-of-parsing-swift3-data-streams。 –

回答

0

好的,所以我有一个工作解决方案。非常感谢马丁·R代表向我展示他上面链接后(Idiomatic method of parsing swift(3) data streams

我基本上采取了类从后马丁R连接,并修改它使用一个NSData对象,而不是一个数据对象: 类的数据流中{ 让数据:NSData的 变种索引= 0 变种atEnd:BOOL { 返回指数> = self.data.length }

init(data:NSData) { 
    self.data = data 
} 

func next() -> UInt8? { 
    guard !self.atEnd else { return nil } 
    let byte = self.data.subdata(with: NSRange(location: self.index, length: 1))[0] 
    self.index += 1 
    return byte 
} 

func next(_ count:Int) -> NSData? { 
    guard self.index + count <= self.data.length else { return nil } 
    let subdata = self.data.subdata(with: NSRange(location: self.index, length: count)) 
    self.index += count 
    return subdata as NSData? 
} 

func upTo(_ marker:UInt8) -> NSData? { 
    if let end = (self.index..<self.data.length).index(where: { self.data.base64EncodedData()[$0] == marker }) { 
     let upTo = self.next(end - self.index) 
     self.skip() // consume the marker 
     return upTo 
    } 
    else { 
     return nil 
    } 
} 

func skip(_ count:Int = 1) { 
    self.index += count 
} 

func skipThrough(_ marker:UInt8) { 
    if let end = (self.index..<self.data.length).index(where: { self.data.base64EncodedData()[$0] == marker }) { 
     self.index = end + 1 
    } 
    else { 
     self.index = self.data.length 
    } 
} 

}

使用该逸一对夫妇的NSData方法一起aStream类,我是能够模仿Java方法DataInputStream.ReadInt()的行为:

var someID : Int = 0 
     //get the part of the data that represents someID 
     guard let someIDData = dataStream.next(4 /*size of someID in the data*/) else { fatalError("Error getting someID bytes")} 
     //convert the data bytes to an Int 
     someIDData.getBytes(&someID, length: someIDData.length) 

如果有人有更好的方式来做到这一点,我很乐意听到!我对Swift很陌生,所以这可能不是最好的方法。这适用于Swift 3.1。