将十六进制字符串中的负数解码为浮点数?

反对

我有一个十六进制字符串,它是数字值,是从外部设备通过串行方式传来的。我使用以下方法一次解码它们:

string tmpValue(incoming hex data, such as FE7258);

int valueInt = Convert.ToInt32(tmpValue, 16);
float XCoord = ((float)valueInt / 100);

我能够对照设备输出检查XCoord的输出,并且当数字为正数时,这将按预期工作。但是,当它们为负数时,我的结果将跳为错误。

即使使用此在线转换器:

十六进制到十进制转换器

我看到,当负数被转换然后再转换回去时,它不再是相同的数字。

有没有解决的办法?如何处理十六进制至浮点转换的负值?

德米特里·拜琴科(Dmitry Bychenko)

当使用负数时,我们实际上是在使用补数

https://zh.wikipedia.org/wiki/Two%27s_complement

-x我们用负数代替负数

-x == ~x + 1

例如,因为-123我们有

  123     = 0000 0000 0111 1011 (binary)
 ~123     = 1111 1111 1000 0100
 ~123 + 1 = 1111 1111 1000 0101 (binary) == FF85 (Hex)

转换FF85回来时,有两个选择:

  • 治疗FF852个字节的符号值(你会得到-123回)
  • 治疗FF854字节的符号值或2字节无符号(你会得到65413

您的情况(奇怪的3字节整数值)

private static String ToHex(int value) {
  return (value & 0xFFFFFF).ToString("X6");
}

private static int FromHex(String value) {
  int v = Convert.ToInt32(value, 16);

  unchecked {
    return (v <= 0x7FFFFF) ? v : v | (int)0xFF000000;
  }
}

测试:

int x = -123;

// FFFF85
string hex = ToHex(x);

// Back -123
int back = FromHex(hex); 

// -101800
Console.Write(FromHex("FE7258"));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章