首先是我写的一个函数,判断传来的字符串a是否等于"马",问题是a的值明明是“马”却不相等.
void judgeProperty(string a)
{
if (a.Equals("马"))
Debug.Log("11111");
}
这是调试的结果:
可以看到a的值的确是“马”,却没有执行if里的语句输出“11111”。
接着我怀疑a是否有空字符串,但我试了a.Trim()后已久返回false。
我接着开始怀疑是不是在对a赋值时的问题,贴上代码:
我是通过读取字节流,然后通过 Encoding.UTF8.GetString(buffer)转换成字符串,然后才通过 OnWords(currentString)函数把字符串传过来的。
int msgSize;
lock (reciveStream)
{
msgSize = reciveStream.Read(buffer, 0, bufferSize);
}
if (msgSize != 0)
{
string str = Encoding.UTF8.GetString(buffer);
currentString = string.Empty;
currentString = str;
//print(currentString);
OnWords(currentString);
}
奇怪的是 如果我直接定义一个 private string ddd = "马";这时a.Equals("马")是返回true的。
我这个问题该如何解决才能让本来就是“马”的字符串变量a在a.Equal("马")中返回true?
18 个解决方案
#1
文件 - > 高级保存选项 -> 看看是不是utf-8 带签名
#2
调试器的局部变量窗口,目前不显示\0等字符,即"马\0\0\0"会显示单个"马"字。
lock (reciveStream)
{
msgSize = reciveStream.Read(buffer, 0, bufferSize); // msgSize很可能比buffer.Length小
}
if (msgSize != 0)
{
string str = Encoding.UTF8.GetString(buffer, 0, msgSize);
...
lock (reciveStream)
{
msgSize = reciveStream.Read(buffer, 0, bufferSize); // msgSize很可能比buffer.Length小
}
if (msgSize != 0)
{
string str = Encoding.UTF8.GetString(buffer, 0, msgSize);
...
#3
string str = Encoding.UTF8.GetString(buffer, 0, msgSize);这个我试了,还是不行。
#4
是带签名的,是这个的问题么?
#5
是带签名的,是这个的问题么?这个要怎么修改?
#6
string str = Encoding.UTF8.GetString(buffer);
你确定这样不会有问题? 你确定 你的buffer 只有一个 马字的大小?。。
你确定这样不会有问题? 你确定 你的buffer 只有一个 马字的大小?。。
#7
buffer的大小我定义的1024位:
private const int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
但我用了string str = Encoding.UTF8.GetString(buffer,0,msgSize);这句。这样有问题么?
#8
调试。
比如检查 str.Length是否等于1
比如检查 msgSize是否等于3
如果不是,可能是发送方出错;也可能是你接收(以及断句)的方法有误。
#9
谢谢,貌似找到原因了,等我调试一下 告诉你
#10
string str = Encoding.UTF8.GetString(buffer);
你确定这样不会有问题? 你确定 你的buffer 只有一个 马字的大小?。。
buffer的大小我定义的1024位:
private const int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
但我用了string str = Encoding.UTF8.GetString(buffer,0,msgSize);这句。这样有问题么?
所以说 你确定没有问题?。。。
#11
妈蛋 刚才截图错了。。
#12
Trim默认移除的是Whitespace
\0不是Whitespace
好好看文档
\0不是Whitespace
好好看文档
#13
妈蛋 刚才截图错了。。
谢谢老司机。的确是“\0”的问题,我调试msgSize的length是1022.单独一个“马”的length是1;
我在这里处理了一下,能够输出“1111”了,没问题了。
void judgeProperty(string a)
{
string aa = Regex.Replace(a, @"[\0]", "");
Debug.Log(aa.Length);
if (aa.Equals("马"))
Debug.Log("11111");
但是我考虑为什么这里
lock (reciveStream)
{
msgSize = reciveStream.Read(buffer, 0, bufferSize);
}
msgSize的大小是1022呢?
然后我在这里打断点进行调试发现了一个问题:
这句话在unity线程里调用会出现如下错误:
ToString can only be called from the main thread.
Constructors and field initializers will be executed from the loading thread when loading a scene.
Don't use this function in the constructor or field initializers, instead move initialization code to the Awake or Start function.
#14
但我用了string str = Encoding.UTF8.GetString(buffer,0,msgSize);这句。这样有问题么?
调试。
比如检查 str.Length是否等于1
比如检查 msgSize是否等于3
如果不是,可能是发送方出错;也可能是你接收(以及断句)的方法有误。
谢谢,貌似找到原因了,等我调试一下 告诉你
length的确不相等。见下文
#15
Trim默认移除的是Whitespace
\0不是Whitespace
好好看文档
谢谢教诲!粗心了。
#16
移除 \0 根本不是正确的做法 你当你的那个msgSize 是拿来打酱油的? 别人都给你返回真实数据长度了 你却直接转换整个buffer
Encoding.xxx.GetBytes(byte[],index,length)你当这个重载是打酱油的?
Encoding.xxx.GetBytes(byte[],index,length)你当这个重载是打酱油的?
#17
移除 \0 根本不是正确的做法 你当你的那个msgSize 是拿来打酱油的? 别人都给你返回真实数据长度了 你却直接转换整个buffer
Encoding.xxx.GetBytes(byte[],index,length)你当这个重载是打酱油的?
我看了服务器端,每一次传来的字节流长度是固定的1024。问题是这个函数:
msgSize = reciveStream.Read(buffer, 0, bufferSize);返回的长度到底是什么长度?
是接收的字节流长度还是读到的数据的长度?
#18
移除 \0 根本不是正确的做法 你当你的那个msgSize 是拿来打酱油的? 别人都给你返回真实数据长度了 你却直接转换整个buffer
Encoding.xxx.GetBytes(byte[],index,length)你当这个重载是打酱油的?
我看了服务器端,每一次传来的字节流长度是固定的1024。问题是这个函数:
msgSize = reciveStream.Read(buffer, 0, bufferSize);返回的长度到底是什么长度?
是接收的字节流长度还是读到的数据的长度?
那就是你发送那边就有问题了 一个马字 你发过来1024字节? 这不是搞笑吗。。对方是有一个1024的缓存区域吧 每次发送把缓存区全部发送过来了吧
通常情况下.Read()返回的是从流中读取到的实际大小数据 假设你的缓存是1024 我发送了 5个字节过来 那么正常情况msgSize是5 当然也有可能是 小于5的一个数 比如3 那么再次调用他可能就是2 了 也就是你的数据在传送过程中可能被拆成了几分 也有可能你那边连续发送两个5字节 的数据过来 你这边读取出来的msgSize可能会出现10的情况 这是粘包的情况 但是 数据总和应该是不会有问题的 如果对发发送了一个大于1024的 那么 你这边的缓存接收不完 那么就可能需要多次接收 反正 数据总和应该是不会有问题的 对发发送了多收 你就收到多少
#1
文件 - > 高级保存选项 -> 看看是不是utf-8 带签名
#2
调试器的局部变量窗口,目前不显示\0等字符,即"马\0\0\0"会显示单个"马"字。
lock (reciveStream)
{
msgSize = reciveStream.Read(buffer, 0, bufferSize); // msgSize很可能比buffer.Length小
}
if (msgSize != 0)
{
string str = Encoding.UTF8.GetString(buffer, 0, msgSize);
...
lock (reciveStream)
{
msgSize = reciveStream.Read(buffer, 0, bufferSize); // msgSize很可能比buffer.Length小
}
if (msgSize != 0)
{
string str = Encoding.UTF8.GetString(buffer, 0, msgSize);
...
#3
string str = Encoding.UTF8.GetString(buffer, 0, msgSize);这个我试了,还是不行。
#4
是带签名的,是这个的问题么?
#5
文件 - > 高级保存选项 -> 看看是不是utf-8 带签名
是带签名的,是这个的问题么?这个要怎么修改?
#6
string str = Encoding.UTF8.GetString(buffer);
你确定这样不会有问题? 你确定 你的buffer 只有一个 马字的大小?。。
你确定这样不会有问题? 你确定 你的buffer 只有一个 马字的大小?。。
#7
string str = Encoding.UTF8.GetString(buffer);
你确定这样不会有问题? 你确定 你的buffer 只有一个 马字的大小?。。
buffer的大小我定义的1024位:
private const int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
但我用了string str = Encoding.UTF8.GetString(buffer,0,msgSize);这句。这样有问题么?
#8
但我用了string str = Encoding.UTF8.GetString(buffer,0,msgSize);这句。这样有问题么?
调试。
比如检查 str.Length是否等于1
比如检查 msgSize是否等于3
如果不是,可能是发送方出错;也可能是你接收(以及断句)的方法有误。
#9
但我用了string str = Encoding.UTF8.GetString(buffer,0,msgSize);这句。这样有问题么?
调试。
比如检查 str.Length是否等于1
比如检查 msgSize是否等于3
如果不是,可能是发送方出错;也可能是你接收(以及断句)的方法有误。
谢谢,貌似找到原因了,等我调试一下 告诉你
#10
string str = Encoding.UTF8.GetString(buffer);
你确定这样不会有问题? 你确定 你的buffer 只有一个 马字的大小?。。
buffer的大小我定义的1024位:
private const int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
但我用了string str = Encoding.UTF8.GetString(buffer,0,msgSize);这句。这样有问题么?
所以说 你确定没有问题?。。。
#11
妈蛋 刚才截图错了。。
#12
Trim默认移除的是Whitespace
\0不是Whitespace
好好看文档
\0不是Whitespace
好好看文档
#13
妈蛋 刚才截图错了。。
谢谢老司机。的确是“\0”的问题,我调试msgSize的length是1022.单独一个“马”的length是1;
我在这里处理了一下,能够输出“1111”了,没问题了。
void judgeProperty(string a)
{
string aa = Regex.Replace(a, @"[\0]", "");
Debug.Log(aa.Length);
if (aa.Equals("马"))
Debug.Log("11111");
但是我考虑为什么这里
lock (reciveStream)
{
msgSize = reciveStream.Read(buffer, 0, bufferSize);
}
msgSize的大小是1022呢?
然后我在这里打断点进行调试发现了一个问题:
这句话在unity线程里调用会出现如下错误:
ToString can only be called from the main thread.
Constructors and field initializers will be executed from the loading thread when loading a scene.
Don't use this function in the constructor or field initializers, instead move initialization code to the Awake or Start function.
#14
但我用了string str = Encoding.UTF8.GetString(buffer,0,msgSize);这句。这样有问题么?
调试。
比如检查 str.Length是否等于1
比如检查 msgSize是否等于3
如果不是,可能是发送方出错;也可能是你接收(以及断句)的方法有误。
谢谢,貌似找到原因了,等我调试一下 告诉你
length的确不相等。见下文
#15
Trim默认移除的是Whitespace
\0不是Whitespace
好好看文档
谢谢教诲!粗心了。
#16
移除 \0 根本不是正确的做法 你当你的那个msgSize 是拿来打酱油的? 别人都给你返回真实数据长度了 你却直接转换整个buffer
Encoding.xxx.GetBytes(byte[],index,length)你当这个重载是打酱油的?
Encoding.xxx.GetBytes(byte[],index,length)你当这个重载是打酱油的?
#17
移除 \0 根本不是正确的做法 你当你的那个msgSize 是拿来打酱油的? 别人都给你返回真实数据长度了 你却直接转换整个buffer
Encoding.xxx.GetBytes(byte[],index,length)你当这个重载是打酱油的?
我看了服务器端,每一次传来的字节流长度是固定的1024。问题是这个函数:
msgSize = reciveStream.Read(buffer, 0, bufferSize);返回的长度到底是什么长度?
是接收的字节流长度还是读到的数据的长度?
#18
移除 \0 根本不是正确的做法 你当你的那个msgSize 是拿来打酱油的? 别人都给你返回真实数据长度了 你却直接转换整个buffer
Encoding.xxx.GetBytes(byte[],index,length)你当这个重载是打酱油的?
我看了服务器端,每一次传来的字节流长度是固定的1024。问题是这个函数:
msgSize = reciveStream.Read(buffer, 0, bufferSize);返回的长度到底是什么长度?
是接收的字节流长度还是读到的数据的长度?
那就是你发送那边就有问题了 一个马字 你发过来1024字节? 这不是搞笑吗。。对方是有一个1024的缓存区域吧 每次发送把缓存区全部发送过来了吧
通常情况下.Read()返回的是从流中读取到的实际大小数据 假设你的缓存是1024 我发送了 5个字节过来 那么正常情况msgSize是5 当然也有可能是 小于5的一个数 比如3 那么再次调用他可能就是2 了 也就是你的数据在传送过程中可能被拆成了几分 也有可能你那边连续发送两个5字节 的数据过来 你这边读取出来的msgSize可能会出现10的情况 这是粘包的情况 但是 数据总和应该是不会有问题的 如果对发发送了一个大于1024的 那么 你这边的缓存接收不完 那么就可能需要多次接收 反正 数据总和应该是不会有问题的 对发发送了多收 你就收到多少