为什么通过 Multipeer Connectivity 发送的字符串在接收端出现乱码?
Why are strings sent via Multipeer Connectivity garbled on the receiving end?
我正在开发一个增强现实应用程序,多个用户可以在其中连接并查看相同的虚拟内容。我正在使用 Apple 的 Multipeer Connectivity 框架进行通信,但在两个连接的对等点之间发送和接收字符串时遇到问题。
这个想法是当一个 SCNNode 添加到用户的虚拟 space 时,Multipeer 将发送节点在 3D 中的位置 space、它的颜色和它在对等网络中的大小网络,接收方可以将相同的内容添加到他们的 space.
我这样构建字符串:
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
let nodeColor = node.geometry?.firstMaterial?.diffuse.contents
let nodePosition = node.position
let dataString = "x: \(nodePosition.x) y: \(nodePosition.y) z: \(nodePosition.z) color: \(nodeColor!) radius: \(sphereRadius)"
let dataToSend = dataString.data(using: .utf8)
MultiPeer.instance.send(data: dataToSend!)
}
发送数据的函数如下:
public func send(data: Data){
if isConnected {
do {
let item = try NSKeyedArchiver.archivedData(withRootObject: data, requiringSecureCoding: true)
try session.send(item, toPeers: session.connectedPeers, with: MCSessionSendDataMode.reliable)
} catch let error {
printDebug(error.localizedDescription)
}
}
}
在接收端:
public func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
let incomingString = String(decoding: data, as: UTF8.self)
print(incomingString)
}
我通过发送字符串测试了代码,这是其中三个字符串在接收端的输出:
Troot�#-27:@����bplist00�X$versionX$objectsY$archiverT$top:-0.04734481 z: -0.019065317 color: UIExtendedSRGBColorSpace 1 0 0 1 radius: 0.01_NSKeyedArchiver�
Troot�#-27:@����bplist00�X$versionX$objectsY$archiverT$topIExtendedSRGBColorSpace 1 0 0 1 radius: 0.01_NSKeyedArchiver�
Troot�#-27:@����bplist00� X$versionX$objectsY$archiverT$top75U$nullOax: 0.01673067 y: -0.048672535 z: -0.02221658 color: UIExtendedSRGBColorSpace 1 0 0 1 radius: 0.01_NSKeyedArchiver�
显然正在发送和接收字符串,但并非没有额外的字符和符号。
感谢任何输入,谢谢!
更新:Martin R. 指出我没有使用 NSKeyedUnarchiver 来解码字符串。我已经更新了我的代码以使用它:
let receivedData = data
let receivedString = String(data: receivedData, encoding: .utf8)
print("Received data \(String(describing: receivedString))")
do {
let unarchiver = try NSKeyedUnarchiver(forReadingFrom: receivedData)
let decodedString = unarchiver.decodeData()
print("Decoded string: \(String(describing: decodedString))")
}catch let error {
print(error.localizedDescription)
}
字符串不再乱码,但为nil。在解码之前这是真的,所以当对等方收到时字符串为 nil。
@Martin R. 通过使用 NSKeyedUnarchiver 解压数据的建议解决了添加符号的问题。之后,我发现接收端的字符串为零。改变
do {
let unarchiver = try NSKeyedUnarchiver(forReadingFrom: receivedData)
let decodedString = unarchiver.decodeData()
print("Decoded string: \(String(describing: decodedString))")
}catch let error {
print(error.localizedDescription)
}
至
do {
let decodedString = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(receivedData)
print("Decoded string: \(String(describing: decodedString))")
}catch let error {
print(error.localizedDescription)
}
问题已解决,现在可以正确发送和接收字符串。
我正在开发一个增强现实应用程序,多个用户可以在其中连接并查看相同的虚拟内容。我正在使用 Apple 的 Multipeer Connectivity 框架进行通信,但在两个连接的对等点之间发送和接收字符串时遇到问题。
这个想法是当一个 SCNNode 添加到用户的虚拟 space 时,Multipeer 将发送节点在 3D 中的位置 space、它的颜色和它在对等网络中的大小网络,接收方可以将相同的内容添加到他们的 space.
我这样构建字符串:
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
let nodeColor = node.geometry?.firstMaterial?.diffuse.contents
let nodePosition = node.position
let dataString = "x: \(nodePosition.x) y: \(nodePosition.y) z: \(nodePosition.z) color: \(nodeColor!) radius: \(sphereRadius)"
let dataToSend = dataString.data(using: .utf8)
MultiPeer.instance.send(data: dataToSend!)
}
发送数据的函数如下:
public func send(data: Data){
if isConnected {
do {
let item = try NSKeyedArchiver.archivedData(withRootObject: data, requiringSecureCoding: true)
try session.send(item, toPeers: session.connectedPeers, with: MCSessionSendDataMode.reliable)
} catch let error {
printDebug(error.localizedDescription)
}
}
}
在接收端:
public func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
let incomingString = String(decoding: data, as: UTF8.self)
print(incomingString)
}
我通过发送字符串测试了代码,这是其中三个字符串在接收端的输出:
Troot�#-27:@����bplist00�X$versionX$objectsY$archiverT$top:-0.04734481 z: -0.019065317 color: UIExtendedSRGBColorSpace 1 0 0 1 radius: 0.01_NSKeyedArchiver�
Troot�#-27:@����bplist00�X$versionX$objectsY$archiverT$topIExtendedSRGBColorSpace 1 0 0 1 radius: 0.01_NSKeyedArchiver�
Troot�#-27:@����bplist00� X$versionX$objectsY$archiverT$top75U$nullOax: 0.01673067 y: -0.048672535 z: -0.02221658 color: UIExtendedSRGBColorSpace 1 0 0 1 radius: 0.01_NSKeyedArchiver�
显然正在发送和接收字符串,但并非没有额外的字符和符号。 感谢任何输入,谢谢!
更新:Martin R. 指出我没有使用 NSKeyedUnarchiver 来解码字符串。我已经更新了我的代码以使用它:
let receivedData = data
let receivedString = String(data: receivedData, encoding: .utf8)
print("Received data \(String(describing: receivedString))")
do {
let unarchiver = try NSKeyedUnarchiver(forReadingFrom: receivedData)
let decodedString = unarchiver.decodeData()
print("Decoded string: \(String(describing: decodedString))")
}catch let error {
print(error.localizedDescription)
}
字符串不再乱码,但为nil。在解码之前这是真的,所以当对等方收到时字符串为 nil。
@Martin R. 通过使用 NSKeyedUnarchiver 解压数据的建议解决了添加符号的问题。之后,我发现接收端的字符串为零。改变
do {
let unarchiver = try NSKeyedUnarchiver(forReadingFrom: receivedData)
let decodedString = unarchiver.decodeData()
print("Decoded string: \(String(describing: decodedString))")
}catch let error {
print(error.localizedDescription)
}
至
do {
let decodedString = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(receivedData)
print("Decoded string: \(String(describing: decodedString))")
}catch let error {
print(error.localizedDescription)
}
问题已解决,现在可以正确发送和接收字符串。