【问题标题】:Convert large hexadecimal string to octal string将大的十六进制字符串转换为八进制字符串
【发布时间】:2012-06-22 14:25:30
【问题描述】:

当数字太大而无法容纳 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);

    }

【问题讨论】:

  • 请注意,您的数字对于 Int32(最大 0xFFFFFFFF)甚至 Int64(最大 0xFFFFFFFFFFFFFFFF)来说太长了。因此,以下解决方案将不起作用...
  • 是的,所以我正在寻找解决方案
  • @user175084 - 如果您必须使用大于 Int64 结构的值,那么您必须创建自己的值。最简单的解决方案是将它们作为两个单独的值处理,这些值可以放入 Int64 中,并将两个字符串简单地组合在一起。
  • @user175084 这还不够。因为0xFF0377(八进制),所以您需要做的不仅仅是获取两个字符并转换它们。
  • @user175084 看来你错过了我的帖子。你提到的数字是不正确的。检查我的帖子(或我的评论),看看如何获​​得正确的值。尝试在 Windows Calc 中输入2BD5,您将看到25725。这不等于您的53325。请记住,三个十六进制半字节 (FFF) 等于四个八进制半字节 (7777)。你用两个半字节 (FF) 尝试了它,它给你一个休息值 (377)。

标签: c# asp.net


【解决方案1】:

看看下面的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;
}

【讨论】:

  • 我已经看过这个..但是我在示例中的十六进制值不断收到错误..请你检查一下..谢谢
  • @user175084 - 提供的代码正是它应该做的。该代码实际上是您问题的答案。您有一个完全独立的问题,您尝试转换的值对于 Int64 来说太大了,这是一个问题。
  • @user175084 您会收到错误,因为您的十六进制值太大。目前有几个解决方案应该适用于任意长度的十六进制值,看看(但他们也借鉴了这个解决方案)。
【解决方案2】:

这并不难。你以前应该用谷歌搜索过它:) 试试这个方法:

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

【讨论】:

  • 哈哈哈....似乎 Gaz 在我之前找到了它.... ;) 但希望您的问题得到解决。 @用户
  • 其他不可解析的字符位于字符串的末尾。
  • @user175084 - 请更新您的问题以解释您的“不可解析”字符评论。
  • 看,除非我们看到您的控制台中显示的某种日志或异常或错误,否则我们无法找出您的问题。在此处显示。至少向我们展示您提供的导致错误的输入以及错误的详细信息。
  • 我想知道为什么他们没有为任何基础实现它。文档说基数必须是 2、8、10 或 16
【解决方案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 Calculator 中键入结果时比较结果中最不重要的部分来轻松验证此结果(当您选择 View > Programmer 或 时,它可以从 Hex 转换为 Oct Alt-3)。即,当您将A92BD5 Windows Calculator 显示为52225725 作为结果时,等于上述内容。

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

【讨论】:

  • 我认为答案是八进制值:164434422275221377173112256227662203406132225153325 请你验证这个值吗?非常感谢男人
  • @user175084:您的答案不正确。请参阅我在问题下对您之前评论的回复。只需在 Windows Calc 中键入最后四个十六进制数字,这对您来说应该是足够的证据,并且还告诉您我的答案是正确的。如果您需要更多解释原因,请告诉我。
【解决方案4】:
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')));

【讨论】:

  • 这会将字节转换为八进制字符串。但是{ 43, 213}0x2BD5,是八进制25725,但您的解决方案给出了053325(参见calc.50x.eu)。
  • 嘿,伙计们,请不要这样。我想将十六进制转换为八进制。那个字节数组只是为了我的测试。谢谢@Able,你是对的。
  • @Abel 它就像BitConverter.ToString 一样工作(一个一个字节并转换为十六进制)。您所做的是将字节数组转换为 int 然后获取它的八进制形式。如果您的字节数组的长度为 100,则此方法将不起作用。
  • @user175084 你可以试试String.Join("", buf.Select(b =&gt; Convert.ToString(b, 8).PadLeft(3, '0')).ToArray())。我的猜测 String.Join 除外 IEnumerable 作为参数是 .Net 4.0 的新参数
  • @user175084 如果您删除PadLeft,您将得到164434422275221377173112256227662203406132225153325,正如您评论的那样。但是您将无法将其解析回字节数组。
【解决方案5】:

我想我明白了你的问题。您正在向上述方法发送一个十六进制值,例如 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方法可以成功转换的字符串长度,这样你就知道如何分割你的大数字字符串了。

【讨论】:

  • 这只有在你首先将字符串分成正确的部分时才有效(你写“使用任何技术”,但应该是,将它们从右侧切开,部分可以被三或六整除),否则只是连接会给你不正确的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 2019-08-23
  • 1970-01-01
  • 2013-02-07
相关资源
最近更新 更多