gpt4 book ai didi

c# - Visual C# - 字符串追加到字符串无法正常工作

转载 作者:太空宇宙 更新时间:2023-11-03 14:02:48 26 4
gpt4 key购买 nike

晚上好

我有一个奇怪的问题。我不是很熟悉 Visual C#,但是我需要编写一个小套接字应用程序来启用与 iOS 应用程序的通信。请检查下面每次收到数据时触发的函数。

public void onDataReceived(IAsyncResult asyn)
{
// Debug.WriteLine("Receiving Data");
try
{
CSocketPacket socketId = (CSocketPacket)asyn.AsyncState;
int iRx = 0;
iRx = socketId.thisSocket.EndReceive(asyn);
char[] chars = new char[iRx + 1];
Decoder d = Encoding.UTF8.GetDecoder();
int charLen = d.GetChars(socketId.dataBuffer, 0, iRx, chars, 0);
System.String szData = new System.String(chars);
Debug.WriteLine(szData);
stringVar += szData;
Debug.WriteLine(stringVar);
szData = "";
startWaitingForData(socketWorker);
}
catch (ObjectDisposedException)
{
Debugger.Log(0, "1", "\n onClientConnection: Socket has been closed!\n");
}
catch (SocketException error)
{
Debugger.Log(0, "1", error.ToString());
}
}

从 iphone 向套接字服务器发送消息效果很好。但是有一个问题。如果我发送 a.e. “消息测试”第一个 Debug.WriteLine(szData) 正确记录字符。 (byte 设置为 byte[1],因此对于每个字节都会调用该函数)。但是,如果我将 szData append 到我的 stringVar 属性,它将无法正常工作。 Debug.WriteLine(stringVar) 将始终只记录第一个字符,在我的示例中它将记录“MMMMMMMMMMMM”(而不是“消息测试”)

不确定我在这里遗漏了什么。非常感谢任何帮助。

谢谢你:)

更新:在我的 startWaitingForData 函数下面:

public class CSocketPacket
{
public System.Net.Sockets.Socket thisSocket;
public byte[] dataBuffer = new byte[1];
}

public void startWaitingForData(System.Net.Sockets.Socket soc)
{
// Debug.WriteLine("Start waiting for data");
try
{
if (workerCallBack == null)
{
workerCallBack = new AsyncCallback(onDataReceived);
}
CSocketPacket socketPacket = new CSocketPacket();
socketPacket.thisSocket = soc;
soc.BeginReceive(socketPacket.dataBuffer, 0, socketPacket.dataBuffer.Length, SocketFlags.None, workerCallBack, socketPacket);
}
catch (SocketException error)
{
Debugger.Log(0, "1", error.ToString());
}
}

对于iphone部分,我使用ASCII编码:

NSData *data = [[NSData alloc] initWithData:[message dataUsingEncoding:NSASCIIStringEncoding]];

stringVar 定义为:

private string stringVar;

最佳答案

我认为需要更多信息才能弄清真相。

但是,iPhone 发送的是什么编码?

另请注意,iRx 会为您提供读取的字节数,但这不一定等于读取的字符数,因为 UTF8 是一种多字节编码。

根据 MSDN您应该使用 GetCharCount 方法获取您需要将数组大小设置为的字符数。

编辑:@Pascal 更新后

根据 Skeet 先生的评论,没有一个完整的版本来调试它,只能猜测问题是什么。另外,您对

的初步描述

If I send a.e. "Message Test" the first Debug.WriteLine(szData) logs the chars correctly

如果您一次只发送一个字节,似乎听起来不对?

我会建议以下尝试修复:

  • 将您的缓冲区大小从 1 字节增加到更合理的大小,例如 256。您是否有任何理由强制它一次执行此 1 字节?
  • 您的 onDataReceived 处理程序调用了您的 startWaitingForData,然后 BeginRecieve 就执行了递归操作;确保在接收之间重置局部变量等。

请注意,如果您的服务器使用 UTF8 编码,那么您的 iPhone 客户端实际上应该使用 UTF8。

关于c# - Visual C# - 字符串追加到字符串无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10292269/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com