【问题标题】:Convert int to hex and then into a format of 00 00 00 00将 int 转换为 hex 再转成 00 00 00 00 的格式
【发布时间】:2011-09-05 16:34:11
【问题描述】:

我有一个递增的整数

然后我想要这个是十六进制的,所以我像这样进行转换:myInt.ToString("X");

然后我需要一个格式为 00 00 00 00 的字符串,但我无法找到将我现在拥有的十六进制字符串转换为这种格式的方法。

【问题讨论】:

  • 如果十六进制数为奇数,是否需要补零(例如07 FF FF FF)?
  • 是的,它总是 8 个字符长,每 2 个字符之间有空格
  • @Jon - 查看我编辑的答案,新方法正是您正在寻找的(没有循环)。

标签: c# .net string c#-4.0 .net-4.0


【解决方案1】:

使用 Linq 查询,您可以这样做:

string.Join(" ", BitConverter.GetBytes(myInt).Reverse().Select(x=>x.ToString("x")));

【讨论】:

    【解决方案2】:

    第 1 部分的趣味模式

    我可以使用Regexes 替换!沃扎!!!

    string str = Regex.Replace(
        String.Format("{0:X8}", myVal), 
        "([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})", 
        "$1 $2 $3 $4"
    );
    

    我使用String.Format 以8 位十六进制格式写入数字,然后使用Regex 插入空格。是的,这是矫枉过正和无用的:-)

    说真的

    string str = String.Format(
        "{0:X2} {1:X2} {2:X2} {3:X2}", 
        (myVal >> 24) & 0xFF, 
        (myVal >> 16) & 0xFF, 
        (myVal >> 8) & 0xFF, 
        myVal & 0xFF);
    

    使用班次和“&& 掩码”一次取一段,并使用带有填充 2 的十六进制格式的 String.Format 组合它们。

    请不要将它们与负数一起使用!

    第 2 部分的趣味模式(愤怒的正则表达式的回归)

    string str = Regex.Replace(
        String.Format("{0:X8}", myVal), 
        "([0-9A-F]{2})(?!$)", 
        "$1 "
    );
    

    在这里,我们搜索不在字符串末尾的 2 个十六进制数字组,并在它们之后添加一个空格(我们可以使用 \B(请记住转义)而不是 (?!$)

    【讨论】:

      【解决方案3】:

      您可以使用“x”后面的数字指定十六进制数字的数量(例如“x2”)。小写的“x”将为您提供小写的十六进制,反之亦然。

      以下方法将是您发现的最不浪费的方法:

      /// <summary>
      /// Converts the specified byte array into a delimited list of hex pairs.
      /// </summary>
      /// <param name="values">The values.</param>
      /// <param name="requiredLength">The required length (in bytes) required.</param>
      /// <param name="delimiter">The delimiter.</param>
      /// <returns>The binary value.</returns>
      static string ToBinaryString(byte[] values, int requiredLength, string delimiter, bool allowLonger)
      {
          if (values == null)
              return null;
          if (values.Length > requiredLength)
          {
              if (allowLonger)
                  requiredLength = values.Length;
              else
                  throw new ArgumentOutOfRangeException("values");
          }
      
          // Create the StringBuilder with the precise length of values.
          var sb = new StringBuilder((2 + delimiter.Length) * requiredLength - delimiter.Length);
      
          var padLength = requiredLength - values.Length;
          for (var i = 0; i < padLength; i++)
              sb.Append(sb.Length == 0 ? "" : delimiter)
                .Append("00");
          for (var i = 0; i < values.Length; i++)
              sb.Append(sb.Length == 0 ? "" : delimiter)
                .Append(values[i].ToString("x2"));
      
          return sb.ToString();
      }
      
      /// <summary>
      /// Converts the specified byte array into a delimited list of hex pairs.
      /// </summary>
      /// <param name="values">The values.</param>
      /// <param name="delimiter">The delimiter.</param>
      /// <returns>
      /// The binary value.
      /// </returns>
      static string ToBinaryString(byte[] values, string delimiter)
      {
          return ToBinaryString(values, 0, delimiter, true);
      }
      

      编辑:如果您有 Int32,则以下内容无需不必要的分配即可工作:

      /// <summary>
      /// Converts the specified <see cref="Int32"/> into a delimited list of hex pairs.
      /// </summary>
      /// <param name="values">The values.</param>
      /// <param name="delimiter">The delimiter.</param>
      /// <returns>The binary value.</returns>
      static string ToBinaryString(int value, string delimeter)
      {
          var u = (uint)IPAddress.HostToNetworkOrder(value);
          var sb = new StringBuilder((2 + delimeter.Length) * 4 - delimeter.Length);
          sb.Append(((u >> 0) & 0xFF).ToString("x2")).Append(delimeter);
          sb.Append(((u >> 8) & 0xFF).ToString("x2")).Append(delimeter);
          sb.Append(((u >> 16) & 0xFF).ToString("x2")).Append(delimeter);
          sb.Append(((u >> 24) & 0xFF).ToString("x2"));
          return sb.ToString();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-24
        • 2021-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-09
        • 1970-01-01
        • 2013-04-05
        相关资源
        最近更新 更多