菜鸟教程小白 发表于 2022-12-11 19:51:58

java - Swift将字节数组转换为整数


                                            <p><p>您好,我是 swift 新手,想将一个字节数组转换为多个整数。我已经用 Java 编写了工作代码,但我不太确定如何快速使用它</p>

<pre><code>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;
      int readTK = dis.read(TK);
      if (readTK == TK.length) {
            Log.e(&#34;photoConnect success&#34;, &#34;anID=&#34; + anID + &#34;, anotherID=&#34; + anotherID + &#34;, TK.length=&#34; + TK.length);
</code></pre>

<p>到目前为止,我在 Swift 中拥有的内容如下:</p>

<pre><code>func base64ToByteArray(base64String: String) -&gt; ? {
    if let nsdata = NSData(base64Encoded: base64String) {
      var bytes = (repeating: 0, count: nsdata.length)
      nsdata.getBytes(&amp;bytes, length: nsdata.length)
      return bytes
    }
    return nil // Invalid input
}
</code></pre>

<p>此函数将其转换为字节数组,但我不确定使用哪个 Swift 类来模拟 Java 中 DataInputStream 的行为。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>好的,所以我有一个可行的解决方案。非常感谢 Martin R 向我展示了他在上面链接的帖子 (<a href="https://stackoverflow.com/questions/38060682/idiomatic-method-of-parsing-swift3-data-streams" rel="noreferrer noopener nofollow">Idiomatic method of parsing swift(3) data streams</a>)</p>

<p>我基本上从 Martin R 链接的帖子中获取了该类,并将其修改为使用 NSData 对象而不是 Data 对象:
    类数据流 {
    让数据:NSData
    变量索引 = 0
    var atEnd :boolean{
      返回索引 >= self.data.length
    }</p>

<pre><code>init(data:NSData) {
    self.data = data
}

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

func next(_ count:Int) -&gt; NSData? {
    guard self.index + count &lt;= 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) -&gt; NSData? {
    if let end = (self.index..&lt;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..&lt;self.data.length).index( where: { self.data.base64EncodedData()[$0] == marker } ) {
      self.index = end + 1
    }
    else {
      self.index = self.data.length
    }
}
</code></pre>

<p>}</p>

<p>使用这个 DataStream 类和几个 NSData 方法,我能够模仿 java 方法 DataInputStream.ReadInt() 的行为:</p>

<pre><code>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(&#34;Error getting someID bytes&#34;)}
      //convert the data bytes to an Int
      someIDData.getBytes(&amp;someID, length: someIDData.length)
</code></pre>

<p>如果有人有更好的方法来实现这一点,我很想听听!我是 Swift 的新手,所以这可能不是最好的方法。这适用于 Swift 3.1。</p></p>
                                   
                                                <p style="font-size: 20px;">关于java - Swift将字节数组转换为整数,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/44549840/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/44549840/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: java - Swift将字节数组转换为整数