【发布时间】:2021-07-20 13:24:51
【问题描述】:
byte[] buffer = null;
while (true)
{
int bytesRead = 0;
try
{
buffer = new byte[BUFFER_SIZE];
bytesRead = clientse.stream.Read(buffer, 0, BUFFER_SIZE);
}
catch
{
break;
}
int ReadLength = 0;
for (int i = 0; i < BUFFER_SIZE; i++)
{
if (buffer[i].ToString("x2") != "cc")
{
ReadLength++;
}
else
break;
}
}
在这里,如果我将“cc”的值更改为其他值,它不会给我正确的读取长度计数。有人能详细说明一下代码中“cc”的用法吗?
【问题讨论】:
-
似乎正在接收的数据具有任意字节值(十六进制的 0xCC 或十进制的 204)来终止消息。当然,这 100% 取决于实现。奇怪的是
bytesRead没有被使用。 -
是从 C++ 代码移植过来的吗?对于调试版本,一些系统用 0xCC 填充新分配的数组,看起来这段代码试图使用它来查看填充了多少缓冲区。(1)那是糟糕的代码,(2)如果数据实际上包括一个 0xCC,(3)它只适用于调试版本,(4)它根本不适用于 C#。解决方案是使用
bytesRead而不是尝试找到第一个未更改的字节(这对于 C# 根本不起作用,并且对于 C++ 充其量是可疑的) -
当然,发送代码可能正在发送一个带有 0xCC 的缓冲区以指示数据结束(可能是因为我在上一条消息中概述的原因)。
-
这样检查效率很低,最好只做
buffer[i] != 0xCC
标签: c# string format byte buffer