Encoding.ASCII.GetString返回空值(仅在Windows应用程序中)

时间:2013-01-02 22:04:03

标签: c# windows ascii encode udpclient

我正在尝试使用Visual Studio 2012创建一个Windows应用程序,但奇怪的东西似乎正在发生...当我在控制台应用程序中运行完全相同的代码时,它工作正常,但似乎我无法输出一旦我在Windows应用程序项目的一个线程中运行它:

private void VisualUDPListener_Load(object sender, EventArgs e)
    {
        //System.Windows.Forms.Form.CheckForIllegalCrossThreadCalls = false;
        new Thread(delegate()
        {
            StartListener();
        }).Start();
    }

    private void StartListener()
    {

        UdpClient listener = new UdpClient(listenPort);
        IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort);

        try
        {
            while (true)
            {
                //log text box
                Log.AppendText("Listening \n");

                byte[] bytes = listener.Receive(ref groupEP);

                string hex_string = BitConverter.ToString(bytes);//this works and returns the correct hex data
                string ascii_string = Encoding.ASCII.GetString(bytes, 0, bytes.Length);//blank???????????

                MessageBox.Show(ascii_string.Length.toString());//outputs 131 which is correct

                MessageBox.Show(ascii_string);// shows a blank message box
                Log.AppendText("--" + ascii_string + hex_string +" \n");//only outputs --
            }

        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
        finally
        {
            listener.Close();
        }
    }

我的目标是.NET Framework 4.5 ...如果我从测试java应用程序发送UDP数据它接收数据很好但是如果我通过代码所针对的移动设备发送完全相同的数据就像空的一样在上面的评论中。 (然后设备必须发送损坏的数据?nope,因为如果上面的代码在控制台应用程序中运行,它运行完美并输出正确的字符串)

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

如注释中所述,字符串以0字节(00-04-02-00-20)开头。 这正确地转换为C#字符串。 MessageBox.Show调用windows api函数MessageBox。 Windows API使用以零结尾的字符串,因此此特定字符串对WinAPI显示为空,因为第一个字节为零。您不能使用使用零终止字符串的API逐字记录/显示此字符串。

您需要将0替换为其他内容,例如ascii_string.Replace((char)0, (char)1)或使用不将零视为特殊字符的apis。