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

标签 java ios arrays swift datainputstream

您好,我是 swift 的新手,想将字节数组转换为多个整数。我已经用 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);

到目前为止,这是我在 Swift 中拥有的内容:

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 的行为。

最佳答案

好的,所以我有一个可行的解决方案。非常感谢 Martin R 向我展示了他上面链接的帖子 (Idiomatic method of parsing swift(3) data streams)

我基本上是从 Martin R 链接的文章中获取类并将其修改为使用 NSData 对象而不是 Data 对象: 类数据流{ 让数据:NSData 变量索引 = 0 var atEnd : boolean { 返回索引 >= 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
    }
}

使用这个 DataStream 类和几个 NSData 方法,我能够模仿 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。

关于java - Swift 将字节数组转换为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44549840/

相关文章:

java - Xml 解析获取标签之间的数据以及父信息

ios - 在 iOS 中播放多首歌曲

ios - 使粒子跟随 spriteKit 中的路径

javascript - 程序只输出部分链表而不是整个链表

java - 为什么我的 Grails 找不到 JDK?

java - 使用 integratedSecurity(Windows 身份验证)通过 JDBC 从 Linux 连接到 SQL Server?

c# - 在c#中将对象转换为Ushort数组

c - 使用交替的最小值和最大值对数组进行排序

java - 如何获取给定函数的调用路径?

ios - 当 UISearchBar 成为横向的第一响应者时,模态视图移动