繁体   English   中英

从 swift 中修改后的 Java UTF(使用 java writeUTF() 方法创建)的前两个字节获取内容长度

[英]Get the content length from first two bytes of modified Java UTF (created using java writeUTF() method) in swift

我正在使用GCDAsyncSocket在 iOS 上创建一个 TCP 客户端(使用 swift)。 客户端正在与用 JAVA 编写的 TCP 服务器通信。 使用 JAVA 的writeUtf()方法将数据写入套接字。 所以要读取 TCP 客户端上的数据,我需要知道套接字上可用数据的长度。 java UTF 格式与标准 UTF 不同,它在数据的前 2 个字节中对内容的长度进行编码。 必须知道传入数据的长度才能读取 GCDAsyncSocket 中的数据。

问题:

  1. 如何快速从修改后的 UTF-8 的前两个字节获取传入数据的大小?

  2. 有没有更好的方法通过检测流的结尾来从 java writeUTF() 读取数据?

我正在使用我自己的 getJavaUTFFrom 函数从 java 服务器 tcp 套接字读取 utf。 首先,您应该从 tcp 套接字获取数据到 NSMutableData 并使用 getJavaUTFFrom 将其内容转换为字符串。

@discardableResult func getJavaUTFFrom(_ data: NSMutableData, location: Int, toStr: inout String)->Int! {

    var utfLength: Int = 0

    //getJavaCharFrom reads utf string length
    getJavaCharFrom(data, location: location, toIntVar: &utfLength)


    if location + utfLength - 1 > data.length {
        print("out of message body range getJavaUTFFrom at location: \(location)")

        return nil 

    }


    var buff = [UInt8](repeating: 0, count: Int(utfLength))
    data.getBytes(&buff, range: NSRange(location: location+MemoryLayout<UInt16>.size, length: Int(utfLength)))
    toStr = String(bytes: buff, encoding: String.Encoding.utf8)!
    return location + MemoryLayout<UInt16>.size + utfLength //returning java modified utf8 string length
}

@discardableResult func getJavaCharFrom(_ data: NSMutableData, location: Int, toIntVar: inout Int)->Int! {

    if location + MemoryLayout<UInt16>.size-1 > data.length {
        print("out of message body range getJavaCharFrom")
        return nil
    }

    var tmp = UInt16(0)
    data.getBytes(&tmp, range: NSRange(location: location, length: MemoryLayout<UInt16>.size))
    toIntVar=Int(tmp.bigEndian)
    return location + MemoryLayout<UInt16>.size
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM