【问题标题】:And operation on hexadecimal strings以及对十六进制字符串的操作
【发布时间】:2016-12-16 10:20:35
【问题描述】:

我有两个长度为 8 位的十六进制字符串。如何对这两个进行& 操作并得到十六进制结果:

40003019 & FE000000 => 40000000

我已尝试将十六进制字符串转换为字节数组并进行单独操作
byte & byte 产生字节,在这种情况下,我分别获得 4 个字节。我正在寻找直接的十六进制结果。

我该怎么做?

var byteResult = new byte[4];
var byteArray1 = StringToByteArray("40003019");
var byteArray2 = StringToByteArray("FE000000");
for(int i = 0 ; i< 4; i++)
{
   byteResult[i] = (byte)(byteArray1[i]  & byteArray1[i]);
}

public static byte[] StringToByteArray(string hex)
{
    return Enumerable.Range(0, hex.Length)
                     .Where(x => x % 2 == 0)
                     .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                     .ToArray();
}

【问题讨论】:

  • 你有没有试过的代码?
  • 听起来你应该解析每个字符串,执行按位 &,然后格式化结果...
  • 我尝试将十六进制字符串转换为长度为 4 的字节数组并进行单独的字节 & 操作并生成字节。但我正在寻找直接的十六进制和操作。
  • 这是另一种方法: UInt32 a = UInt32.Parse("40003019", System.Globalization.NumberStyles.HexNumber); UInt32 b = UInt32.Parse("FE000000", System.Globalization.NumberStyles.HexNumber); Console.WriteLine((a & b).ToString("x8")); Console.ReadLine();

标签: c# .net


【解决方案1】:

转换(转换为整数)、计算(按位和 - &amp;)、转换(返回字符串):

  string left = "40003019";
  string right = "FE000000";

  string result = 
    (Convert.ToUInt32(left, 16) & Convert.ToUInt32(right, 16)).ToString("X8");

一般情况下(可以超出UInt64范围的长字符串)

private static int CharToByte(char value) {
  if (value >= '0' && value <= '9')
    return value - '0';
  else if (value >= 'a' && value <= 'f')
    return value - 'a' + 10;
  else if (value >= 'A' && value <= 'F')
    return value - 'A' + 10;
  else
    return -1;
}

private static string BitwiseAnd(String left, String right) {
  // left and right can have different lengths
  int n = Math.Min(left.Length, right.Length);

  StringBuilder sb = new StringBuilder(n);

  for (int i = 0; i < n; ++i) {
    int v = CharToByte(left[left.Length - n + i]) & 
            CharToByte(right[right.Length - n + i]);

    sb.Append(v.ToString("X1"));
  }

  return sb.ToString();
}

...

string left = "40003019";
string right = "FE000000";

string result = BitwiseAnd(left, right);

【讨论】:

  • 天啊 - 这太深了:)
猜你喜欢
  • 2014-03-14
  • 2010-10-04
  • 2019-02-21
  • 2019-07-27
  • 1970-01-01
  • 2014-03-07
  • 2013-01-14
  • 2020-11-11
  • 1970-01-01
相关资源
最近更新 更多