0

標的 :

最初に整数値をhexstringに変換し、次にbyte[]に変換します。

例 :

   Need to convert  int:1024 to hexstring:400 to byte[]: 00000100 00000000

方法:

整数から16進文字列に変換するために、以下のコードを試しました

    int i=1024;
    string hexString = i.ToString("X");

hexstring値を「400」として取得しました。次に、以下のコードを使用して、16進文字列をbyte[]に変換してみました

    byte[] value = HexStringToByteArray(hexValue);

    /* function for converting hexstring to  byte array */
    public  byte[] HexStringToByteArray(string hex)
    {

        int NumberChars = hex.Length;

        if(NumberChars %2==1)
          throw new Exception("Hex string cannot have an odd number of digits.");

        byte[] bytes = new byte[NumberChars / 2];
        for (int i = 0; i < NumberChars; i += 2)
            bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
        return bytes;

    }

エラー:

ここで、「16進文字列は奇数桁にすることはできません」という例外が発生しました

解決策:??

4

4 に答える 4

5

ToStringに特定の桁数を返すように強制できます。

string hexString = i.ToString("X08");
于 2012-06-13T13:15:08.267 に答える
3

例外は独自のコードによってスローされます。コードをより柔軟にして、奇数桁の16進文字列を受け入れることができます。

if (hex.Length % 2 == 1) hex = "0"+hex;

これで、奇数/偶数チェックを削除でき、コードは問題ありません。

于 2012-06-13T13:18:34.757 に答える
2

あなたのコードはあなたが見ている例外をスローします:

throw new Exception("Hex string cannot have an odd number of digits.");

変換方法を改善して、次のような奇数の16進文字列の長さも受け入れることができます。

using System.Collections.Generic;
using System.Linq;

// ...

public  byte[] HexStringToByteArray(string hex)
    {
        var result = new List<byte>();

        for (int i = hex.Length - 1; i >= 0; i -= 2)
            {
                if (i > 0)
                    {
                        result.Insert(0, Convert.ToByte(hex.Substring(i - 1, 2), 16));
                    }
                else
                    {
                        result.Insert(0, Convert.ToByte(hex.Substring(i, 1), 16));
                    }
            }

        return bytes.ToArray();
    }

このコードは、16進文字列を最後から繰り返し、結果のリストの先頭に新しいバイトを追加する必要があります(値を返す前に配列に変換されます)。1桁残っている場合は、個別に扱われます。

于 2012-06-13T13:17:21.403 に答える
1

16進文字列の桁数が奇数であり、それを明示的にチェックして例外をスローしています。このコード行をそこに配置する理由と、他のロジックを優先してそれを削除する必要があるかどうかを判断する必要があります。

その他のオプションは次のとおりです。

  1. 文字列の先頭に「0」を追加して、文字列の長さを均等にします
  2. そのコードを呼び出している人は誰でも、常に偶数の長さの文字列を提供するように強制します
  3. 奇数の文字を適切に処理するように、後のコードを変更してください...

コメントで、あなたは最初のものがあなたが知る必要があることであると提案しました:その場合:

if(hex.Length%2==1)
    hex = "0"+hex;

これをメソッドの先頭に置き、奇数を取得した場合は、自動的にゼロを追加します。もちろん、後でチェックして例外をスローすることもできます。

注意すべき点は、入力文字列を16進数として検証するか、変換の周りにtry catchを配置して、それが有効な16進数文字列であることを確認することです。

また、文字列が必要な中間ステップなのか、必要だと思うステップなのかが明確でないため、中間文字列なしでバイトに変換するC#int tobyte[]に興味があるかもしれません。

于 2012-06-13T13:19:53.590 に答える