2017-06-14 132 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。