2

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データを送信すると、データは正常に受信されますが、コードが意図されているモバイルデバイスを介してまったく同じデータを送信すると、コメントのように空になりますその上。(その場合、デバイスは破損したデータを送信しているに違いありませんか? 上記のコードをコンソール アプリで実行すると、完全に実行され、正しい文字列が出力されるため、いいえ)

どんな助けでも大歓迎です。

4

1 に答える 1

3

コメントに記載されているように、文字列は0バイト(00-04-02-00-20)で始まります。これは正しくC#文字列に変換されます。MessageBox.ShowWindowsAPI関数を呼び出しますMessageBox。Windows APIはゼロで終了する文字列を使用するため、最初のバイトがゼロであるため、この特定の文字列はWinAPIには空のように見えます。ゼロで終了する文字列を使用するAPIを使用して、この文字列をそのままログに記録/表示することはできません。

0を他の何かに置き換えるか、ascii_string.Replace((char)0, (char)1)ゼロを特殊文字として扱わないAPIを使用する必要があります。

于 2013-01-02T23:03:03.023 に答える