将大十六进制字符串转换为八进制字符串

时间:2012-06-22 14:25:30

标签: c# asp.net

当数字太大而不适合64位数时,如何将以十六进制字符串形式给出的值转换为八进制格式?

我目前将字节数组转换为十六进制,如此

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);

以十六进制输出:

7404E412BD911F077B4AAE973690E031D2A92BD5

如何获得八进制表示?

所以我之前尝试过这个,但它不起作用。

string binaryval = "";


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

    foreach (char ch in hexValue)
    {

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

    }

5 个答案:

答案 0 :(得分:4)

查看以下link on how to convert hex to decimal, octal or binary。它附带完整的代码示例:

/// <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;
}

答案 1 :(得分:3)

这并不难。你之前应该用Google搜索它:) 试试这个方法:

public static string hex2Octal(string hexvalue)
   {
      string binaryval = "";
      binaryval = Convert.ToString(Convert.ToInt32(hexvalue, 16), 8);
      return binaryval;
   }

答案 2 :(得分:3)

假设你从一个任意长度的十六进制字符串开始,我认为你能做的最好就是取三个字节并转换它们,因为0xFFFFFF正是77777777八进制(有一个或两个字节你必须做更多的计算,所以这只是最简单的方法。)

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;
}

这将为您提供以下正确的八进制结果:

72004710112754421740736645256456332207003072252225725

您可以通过在Windows计算器中键入较小的数字并比较结果中最不重要的部分来轻松验证此结果(当您选择View&gt; Programmer或替代-3 )。即,当您使用A92BD5 Windows计算器显示52225725作为结果时,等于上述内容。

你不能简单地连接转换每个字节或每四个字节(int)的结果的原因是只有一个半字节适合两个八进制(FFF等于7777,但范围00-FF适合000-377),或三个字节适合四个八进制(FFFFFF等于77777777)。这就是为什么我选择在我的方法中分成六位数。

答案 3 :(得分: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')));

答案 4 :(得分:0)

我想我得到了你的问题。您正在向上述方法发送十六进制值,类似于0A45D,当Convert.ToInt32方法获得该值时,它无法解析。对于Int32结构,您的值也更大。 所以简单地取你的数字(十六进制表示),使用任何技术将它分成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方法可以成功转换的字符串长度,这样您就可以知道如何划分大数字字符串。