![](/img/trans.png)
[英]How to get 'original' bytes of a Java String when read from DataOutputStream.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 中的数据。
问题:
如何快速从修改后的 UTF-8 的前两个字节获取传入数据的大小?
有没有更好的方法通过检测流的结尾来从 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.