2017-06-14 16 views
2

こんにちは私は素早く新しいですし、バイト配列をいくつかの整数に変換したいと思います。私はJavaで動作するコードを書かれているが、私は迅速バイト配列を整数に素早く変換する

ここ
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クラスがJavaのDataInputStreamの動作を模倣するためにどのようなクラスを使用するのかよくわかりません。

+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の VARインデックス= 0 するvar atEnd:このダットを使用してブール{ リターンインデックス> = 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クラスは、I)は、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で動作します。