【问题标题】:c# bitconverter.ToString convert to hexadecimal stringc# bitconverter.ToString 转换为十六进制字符串
【发布时间】:2013-08-19 10:21:22
【问题描述】:

我正在使用BitConverter.ToString(bytes) 将字符串转换为十六进制字符串,然后将其进一步转换为整数或浮点数。

但是输入流由 0 组成,表明字节值为 0。所以假设我有一个整数,它由从位置 x 开始的 2 个字节输入表示,第一个字节由 EE 组成,而第二个字节是 @987654324 @。现在,当我使用BitConverter.ToString(bytes, x, 2).Replace ("-","") 时,我得到的输出为EE00,其整数值为60928,但在这种情况下,输出应该是238,它仅将第一个字节EE 转换为整数。

但在某些其他情况下,这 2 个字节可能是 EE01,其整数值将是 60929,在这种情况下是正确的。

有什么建议可以解决我的问题吗?

由于有些人说这个问题令人困惑,我将重申我的问题,我有很长的十六进制字符串作为输入。在十六进制字符串中

1) 前 12 个字节代表字符串。 2)接下来的 11 个字节也代表一些其他的字符串。 3) 接下来的 1 个字节代表整数。 4) 接下来的 3 个字节代表整数。 5) 接下来的 4 个字节代表整数。 6) 接下来的 4 个字节代表浮点数。 7) 接下来的 7 个字节代表字符串。 8) 接下来的 5 个字节代表整数。

所以对于第 4 种情况,如果字节是 ee 00 00,那么我应该忽略 0 并将 ee 转换为整数。但如果它 ee 00 ee 那么我应该将 ee00ee 转换为整数。此外,每次我都会遵循与上述相同的模式。

【问题讨论】:

  • 您的帖子有点令人困惑-您是说“00”标志着流的结束吗?如果是这样,你甚至不应该将它传递给转换器......
  • int result = int.Parse(string.Join("", input.Select((item, inx) => new { item, inx }).GroupBy(x => x.inx / 2).Select(g => new string(g.ToArray())).Where(s => s != "00" && s.Length != 2));
  • 我想说假设我有很长的十六进制字符串,例如 77 77 87 53 23 24 00 00 00 29 84 84 ee 00 ee。现在假设我需要这个字符串中的一些 int 值,比如前 4 个字节代表一些 int,所以我将取 77 77 87 53 并将其转换为整数或浮点数。现在假设对于其他一些情况,我再次采用 4 个字节 24 00 00 00 所以在这种情况下,我应该忽略 24 之后的 0 并将 24 十六进制转换为整数,但在其他一些输入中,这个值可能是 24 00 00 01 所以在这种情况下我需要考虑十六进制 24000001 并将其转换为整数。
  • @user2673943 你为什么不简单地使用BitConverter.ToInt32(buf,0);。它会像你描述的那样工作。

标签: c# hex bitconverter


【解决方案1】:

此方法将十六进制字符串转换为字节数组。

public static byte[] ConvertHexString(string hex)
{ 
  Contract.Requried(!string.IsNullOrEmpty(hex));

  // get length
  var len = hex.Length;

  if (len % 2 == 1)
  {
    throw new ArgumentException("hexValue: " + hex);
  }

  var lenHalf = len / 2;

  // create a byte array
  var bs = new byte[lenHalf];

  try
  {
    // convert the hex string to bytes
    for (var i = 0; i != lenHalf; i++)
    {
      bs[i] = (byte)int.Parse(hex.Substring(i * 2, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
    }
  }
  catch (Exception ex)
  {
    throw new ParseException(ex.Message, ex);
  }

  // return the byte array
  return bs;
}

从另一边:

public static string ConvertByteToHexString(byte num)
{
  var text = BitConverter.ToString(new[] { num });

  if (text.Length == 1)
  {
    text = "0" + text;
  }

  return text;
}

【讨论】:

  • 已经内置了一个。 var byteArray = SoapHexBinary.Parse(hexString).Value
  • 但在这里您需要参考使用 System.Runtime.Remoting.Metadata.W3cXsd2001;有些人不想要这个链接。
【解决方案2】:

我的问题已经解决了。我犯了 Endianness 的错误。我收到的数据是 EE 00,在转换为整数之前我应该​​把它当作 00 EE。感谢所有为我的问题提供解决方案的人,很抱歉错过了这个重要的问题。

【讨论】:

    猜你喜欢
    • 2018-01-31
    • 2017-08-12
    • 2014-06-09
    • 2018-06-06
    • 1970-01-01
    • 2013-02-07
    • 2022-07-22
    • 1970-01-01
    • 2018-01-22
    相关资源
    最近更新 更多