0

数値が大きすぎて 64 ビットの数値に収まらない場合、16 進文字列として指定された値を 8 進形式に変換するにはどうすればよいですか?

現在、このようにバイト配列を16進数に変換しています

Byte[] data = { 116, 4, 228, 18, 189, 145, 31, 7, 123, 74, 174, 151, 54, 144, 224, 49, 210, 169, 43, 213 };
hex = BitConverter.ToString(data).Replace("-", string.Empty);

16 進数での出力:

7404E412BD911F077B4AAE973690E031D2A92BD5

8 進数表現を取得するにはどうすればよいですか?

だから私はこれを以前に試しましたが、うまくいきません。

string binaryval = "";


  binaryval = Convert.ToString(Convert.ToInt32(hexValue,16), 8);

    foreach (char ch in hexValue)
    {

           binaryval += Convert.ToString(Convert.ToInt32(ch.ToString(), 16), 8);

    }
4

5 に答える 5

4

16 進数を 10 進数、8 進数、または 2 進数に変換する方法については、次のリンクをご覧ください。完全なコード例が付属しています:

/// <summary>
/// Hex2s the octal.
/// </summary>
/// <param name="hexvalue">The hexvalue.</param>
/// <returns></returns>
public static string hex2Octal(string hexvalue)
{
   string binaryval = "";
   binaryval = Convert.ToString(Convert.ToInt32(hexvalue, 16), 8);
   return binaryval;
}
于 2012-06-22T14:27:58.207 に答える
3

これはそれほど難しいことではありません。以前にグーグルで検索したはずです:)この方法を試してください:

public static string hex2Octal(string hexvalue)
   {
      string binaryval = "";
      binaryval = Convert.ToString(Convert.ToInt32(hexvalue, 16), 8);
      return binaryval;
   }
于 2012-06-22T14:28:57.827 に答える
3

0xFFFFFF任意の長さの 16 進数文字列から始めると仮定すると、正確に8 進数であるため、3 バイトごとに変換するのが最善だと思います77777777(1 バイトまたは 2 バイトでは、さらに計算を行う必要があるため、これは単純です)。最も簡単な方法)。

string hex = "7404E412BD911F077B4AAE973690E031D2A92BD5";
string octal = "";

for (int i = hex.Length; i > 0; i -= 6)
{
    string threebyte;
    if (i < 6)
        threebyte = hex.Substring(0, hex.Length % 6);
    else
        threebyte = hex.Substring(i - 6, 6);

    octal = Convert.ToString(Convert.ToInt32(threebyte, 16), 8) + octal;
}

これにより、次の正しい 8 進数の結果が得られます。

72004710112754421740736645256456332207003072252225725

この結果は、Windows 電卓 ([表示] > [プログラマー] を選択するか、または を選択すると、16 進数から 10 進数に変換できます) に入力するときに、より小さい数値を取り、結果の最下位部分を比較することで簡単に確認できますAlt-3。つまり、A92BD5Windows 電卓を52225725結果として表示すると、上記と同じになります。

各バイトまたは各 4 バイト (int) を変換した結果を単純に連結できない理由は、1.5 バイトのみが 2 つの 8 進数 (FFFに等しい7777が、範囲は に00-FF収まる000-377) に収まるか、または 3 バイトが 4 に収まるためです。 8 進数 (FFFFFF等しい77777777)。これが、私のアプローチで 6 桁に分割することを選択した理由です。

于 2012-06-22T15:09:51.367 に答える
1
Byte[] data = { 116, 4, 228, 18, 189, 145, 31, 7, 123, 74, 174, 151, 54, 144, 224, 49, 210, 169, 43, 213};
var str = String.Join("", data.Select(b => Convert.ToString(b,8).PadLeft(3,'0')));

-

//First hex string to byte array
string hex = "7404E412BD911F077B4AAE973690E031D2A92BD5";
List<byte> buf = new List<byte>();
for (int i = 0; i< hex.Length / 2; i++) 
     buf.Add(Convert.ToByte(hex.Substring(i * 2, 2), 16));

//Then to octal as above
var str = String.Join("", buf.Select(b => Convert.ToString(b,8).PadLeft(3,'0')));
于 2012-06-22T14:53:14.463 に答える
0

私はあなたの問題を理解していると思います。0A45D のような 16 進数値を前述のメソッドに送信しており、Convert.ToInt32 メソッドがその値を取得しているときに、解析に失敗しています。また、Int32 構造体の値は大きくなります。 したがって、単純に数字 (16 進表現) を取得し、任意の手法を使用して 2 つの小さな文字列に分割し、それらを上記のメソッドに別々に渡します。文字列を取得して加算します。 次のようなもの:

public static string BigHexToOct(string number)
{
    string a= "first splitted part from number";
    string b= "second splitted part from number";
    string result= this.hex2Octal(a)+this.hex2Octal(b);
    return result;

}

試してみて、私たちに知らせてください。

この方法を試すことができます。最初に指定された文字列の一部を取り、正常に変換されたかどうかを確認します。そうである場合は、メソッドが正常に変換できる文字列の長さを増やしhex2octalます。これにより、大きな数の文字列を分割する方法がわかります。

于 2012-06-22T15:03:42.840 に答える