>" + Syst-6ren">
gpt4 book ai didi

c# - 为什么我的编码显示两次?

转载 作者:可可西里 更新时间:2023-11-01 02:45:22 26 4
gpt4 key购买 nike

byte[] lengthBytes = new byte[4];
serverStream.Read(lengthBytes, 0, 4);
MessageBox.Show("'>>" + System.Text.Encoding.UTF8.GetString(lengthBytes) + "<<'");
MessageBox.Show("Hello");

这是我用来调试的代码。我现在有 2 个消息框。如果我使用 Debug.WriteLine,它也会打印两次。

Msgbox 1: '>>/   (Note that this is still 4 characters long, the last 3 bytes are null.
Msgbox 2: '>>{"ac<<'
Msgbox 3: Hello

我正在尝试发送 4 个字节和一个整数,即消息的长度。这很好('/' 是 47 的 utf8)。问题是消息的前 4 个字节也被读取 ('{"ac')。我完全不知道这是怎么发生的,我已经调试了几个小时,但我无法理解它。我的一个 friend 建议在 StackOverflow 上创建一个帐户,所以我在这里 :p

感谢所有的帮助:)

编辑:提问者的真实代码

My code http://kutj.es/2ah-j9

最佳答案

你正在犯传统的程序员错误,每个人都必须犯一次,才能学会如何避免它并正确地做。这主要是因为编写了有问题的调试代码而偏离了轨道,并且使得很多更难发现您的错误:

  • 从不 编写使用 MessageBox.Show() 的调试代码。这是一个非常非常邪恶的函数,它会导致重入。昂贵的词意味着它只会卡住用户界面,不会卡住您的程序。它继续运行,可能出错的事情之一是您发布的代码再次执行。重新进入。您会看到两个消息框。而且您将拥有一个完全损坏的程序状态,因为您的代码从未被编写为假设它可以重新输入。这就是为什么您提示 4 个字节的数据被吞噬了。

此处使用的正确工具是真正 卡住您的程序的功能。调试器断点。

  • 永远不要假设二进制数据可以转换为文本。您收到的那 4 个字节包含二进制零。它没有特征。更糟糕的是,它充当许多操作系统调用的字符串终止符,调试器使用的那种,Debug.WriteLine() 等。这就是为什么你看不到“<<”

此处使用的正确工具是调试器监视或工具提示,它可以让您直接查看数组。如果您绝对必须生成诊断字符串,请使用 BitConverter.GetString()。

  • 从不假设流的 Read() 方法将始终返回您要求的字节数。在代码中使用返回值是一项硬性要求。这是您程序中的真正错误,是您实际尝试修复的唯一错误。

正确的解决方案是继续调用 Read(),直到您从之前读取的 length 中计算出预期接收的字节数。您将需要一个 MemoryStream 来存储您获得的 byte[] block 。

关于c# - 为什么我的编码显示两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25097238/

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