2

私は C++ 開発者で、先週 wpf に移行しました。私は C++ アプリで sprintf を何度も使用してきましたが、今では C# と同等のものを用意する必要があります。これが私がやったことですC ++です:

char t_str[4] = {};
for(int i = 0; i < 4; i++)
{ 
    sprintf(t_str, "%02X", buffer[i]);
m_apiResponse[i]->setText(String(t_str));
}

buffer[0] = 20; buffer[1] = 30; buffer[2] = 40; buffer[3] = 50;m_apiResponseテキストボックスです。

次のようにC#でこれを行いました:

Byte[] t_str = new Byte[4];
for (int i = 0; i < 4; i++)
{
         string bufstring = String.Format("{0:02}", buffer[i]);
         t_str = Encoding.UTF8.GetBytes(bufstring);
}

Response1Box = Convert.ToString(t_str[0]);
Response2Box = Convert.ToString(t_str[1]);
Response3Box = Convert.ToString(t_str[2]);
Response4Box = Convert.ToString(t_str[3]);

ここで、ResposeBox はバインド先のテキスト ボックスです。

// Description of Response1Box
    private string _Response1Box;
    public string Response1Box
    {
        get
        {
            return _Response1Box;
        }

        set
        {
            _Response1Box = value;
            OnPropertyChanged("Response1Box");
        }
    }

buffer[64]バイト[]です。

私のC ++メソッドが行う期待される答えが得られません。これは正しい方法ですか:string bufstring = String.Format("{0:02}", buffer[i]); t_str = Encoding.UTF8.GetBytes(bufstring);どこが間違っていますか???

助けてください :)

4

3 に答える 3

5

試してみてください

string bufstring = String.Format("{0:D2}", buffer[i]);

または (16 進出力の場合)

string bufstring = String.Format("{0:X2}", buffer[i]);

または (C/C++ スタイルの 16 進プレフィックス付き)

string bufstring = String.Format("0x{0:X2}", buffer[i]);

複合フォーマット および標準数値フォーマット文字列を参照してください。

もちろん、C++ ループ内で を呼び出しますm_apiResponse[i]->setText。同じ結果を得るには、C# ループでも同様のことを行う必要があります。

string[] response = new TextBox[] {Response1Box, Response2Box, Response3Box, Response4Box};
for (int i = 0; i < 4; i++)
     response[i] = String.Format("{0:X2}", buffer[i]);

更新:ResponseBoxが何であるかは明確ではありませんが、ResponseBoxというオブジェクトインスタンス内にResponse[X]Boxという名前の4つの文字列プロパティがある場合、これらのプロパティをこの方法でループの外に設定できます

ResponseBox.Response1Box = response[0];
ResponseBox.Response2Box = response[1];
.......
于 2012-10-26T15:01:03.413 に答える
2

バイト配列ロジックに問題があると思います。

あなたはbyte[] t_str = new byte[4];4のバイト配列です。

ただし、複数回割り当ててt_str、元の 4 バイトを上書きします。

おそらく、次のような宣言を探しているでしょう。

byte[][] t_str = new byte[4][];

これは配列の配列になります。

そしてあなたのループ内:

t_str[i] = Encoding.UTF8.GetBytes(bufstring);

編集:

または、私がマークから外れている場合は、次のようにすることができます:

Response1Box = buffer[0].ToString("X2");
Response2Box = buffer[1].ToString("X2");
Response3Box = buffer[2].ToString("X2");
Response4Box = buffer[3].ToString("X2");

bufferそれがバイト配列であり、個々のバイト値を書き出すと仮定します

于 2012-10-26T15:04:42.050 に答える
0

C#チェックで必要になる可能性のあるすべての文字列形式は次のとおり です。次のようなものが必要になると思います。

String str = String.Format("Hello {0:0.00} {1:0.00}", 55, 20);
于 2012-10-26T15:19:25.590 に答える