web-dev-qa-db-ja.com

C#16進数からASCIIへ

私はこれを使用して16進数の文字列をASCIIに変換しようとしています:

public void ConvertHex(String hexString)
{
    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < hexString.Length; i += 2)
    {
        String hs = hexString.Substring(i, i + 2);
        System.Convert.ToChar(System.Convert.ToUInt32(hexString.Substring(0, 2), 16)).ToString();
    }
    String ascii = sb.ToString();
    MessageBox.Show(ascii);
}

しかし、私はアウトまたは境界の例外を受け取ります、それは明白なエラーであると確信していますが、私が試した他のコードも機能しません。私は何を間違えていますか?

17
Pete

このコードは16進文字列をASCIIに変換します。これをコピーしてクラスに貼り付け、インスタンス化せずに使用できます

public static string ConvertHex(String hexString)
{
    try
    {
        string ascii = string.Empty;

        for (int i = 0; i < hexString.Length; i += 2)
        {
            String hs = string.Empty;

            hs   = hexString.Substring(i,2);
            uint decval =   System.Convert.ToUInt32(hs, 16);
            char character = System.Convert.ToChar(decval);
            ascii += character;

        }

        return ascii;
    }
    catch (Exception ex) { Console.WriteLine(ex.Message); }

    return string.Empty;
}
24
ArnaldoRivera

がある  ここで3つの問題:

  1. 繰り返しごとにiを2ずつ増やしているため、hexString.Length - 1で終了する必要があります。 これは実際には問題ではありません。最後の反復後に2ずつインクリメントすると、チェックされた長さを超えてカウンターが表示されます。
  2. hexStringから間違った文字数を取っています。
  3. hsは使用されません。
  4. sbには何も追加していません。

これを試して:

for (int i = 0; i < hexString.Length; i += 2)
{
    string hs = hexString.Substring(i, 2);
    sb.Append(Convert.ToChar(Convert.ToUInt32(hs, 16)));
}

型を名前空間Systemで修飾する必要がないことに注意してください(ファイルの先頭でusingステートメントで参照したと仮定します)。

19
Will Vousden
String hs = hexString.Substring(i, i + 2);
System.Convert.ToChar(System.Convert.ToUInt32(hexString.Substring(0, 2), 16)).ToString();

hsを使用したことがないことに気づきましたか??

そして、あなたは最初の2文字を何度も変換していますか?

2
Henk Holterman

インデックスを2ずつ増やしているため、文字列の長さの1つ前のループを停止する必要があります。それ以外の場合、ループの最後の反復は、文字列の終わりを超えて文字を読み取ろうとします。

for (int i = 0; i < hexString.Length - 1, i += 2)
1
Andy White