Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从十六进制字符串将负数解码为浮点?_C#_Hex - Fatal编程技术网

C# 从十六进制字符串将负数解码为浮点?

C# 从十六进制字符串将负数解码为浮点?,c#,hex,C#,Hex,我有一个十六进制字符串,它是数字值,来自外部设备的串行数据。我使用以下方法一次解码一个块: string tmpValue(incoming hex data, such as FE7258); int valueInt = Convert.ToInt32(tmpValue, 16); float XCoord = ((float)valueInt / 100); 我能够对照设备输出检查XCoord的输出,当数字为正数时,这将按预期工作。然而,当它们为负值时,我的结果就会跳到错误 即使使用此

我有一个十六进制字符串,它是数字值,来自外部设备的串行数据。我使用以下方法一次解码一个块:

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

int valueInt = Convert.ToInt32(tmpValue, 16);
float XCoord = ((float)valueInt / 100);
我能够对照设备输出检查XCoord的输出,当数字为正数时,这将按预期工作。然而,当它们为负值时,我的结果就会跳到错误

即使使用此在线转换器:

我看到当一个负数被转换,然后再转换回来,它就不再是同一个数了

有办法解决这个问题吗?如何在十六进制到浮点的转换中处理负值?

当处理负数时,我们实际上使用的是补数:

也就是说,我们使用

-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
转换回时,有两个选项:

  • FF85
    视为2字节有符号值(您将得到
    -123
    返回)
  • FF85
    视为4字节有符号值或2字节无符号值(您将得到
    65413
在您的情况下(奇怪的3字节整数值)

在处理负数时,我们实际上使用的是补数:

也就是说,我们使用

-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
转换回时,有两个选项:

  • FF85
    视为2字节有符号值(您将得到
    -123
    返回)
  • FF85
    视为4字节有符号值或2字节无符号值(您将得到
    65413
在您的情况下(奇怪的3字节整数值)


如果使用非标准字节大小,例如三个字节作为问题帖子,则可以使用简单减法执行转换:

public static int ThreeByteHexToSignedInt(string hex)
{
    var val = Int32.Parse(hex, System.Globalization.NumberStyles.AllowHexSpecifier);

    if(val > 0xEFFFFF) // If greater than maximum postive 3 byte int
    {
        val = val - 0xFFFFFF - 1; // take the compliment
    }

    return val;
}
例如:

ThreeByteHexToSignedInt("000001"); // Returns 1
ThreeByteHexToSignedInt("FFFFFF"); // Returns -1
ThreeByteHexToSignedInt("FE7258"); // Returns -101800
ThreeByteHexToSignedInt("00FFFE"); // Returns 65534

对于float/double,您只需获取此操作的结果并执行直接强制转换,或者使用
Convert
静态类。

如果您使用非标准字节大小,例如三个字节作为问题帖子,您可以使用简单的减法执行转换:

public static int ThreeByteHexToSignedInt(string hex)
{
    var val = Int32.Parse(hex, System.Globalization.NumberStyles.AllowHexSpecifier);

    if(val > 0xEFFFFF) // If greater than maximum postive 3 byte int
    {
        val = val - 0xFFFFFF - 1; // take the compliment
    }

    return val;
}
例如:

ThreeByteHexToSignedInt("000001"); // Returns 1
ThreeByteHexToSignedInt("FFFFFF"); // Returns -1
ThreeByteHexToSignedInt("FE7258"); // Returns -101800
ThreeByteHexToSignedInt("00FFFE"); // Returns 65534


对于float/double,您只需获取此操作的结果并执行直接强制转换,或者使用
Convert
static类。

十六进制表示法有多少个字符长?它必须是一个固定的数字,我假定它是一个较长的字符串,我将其拆分以提供所需的值。例如,
FE7258
的输入应该给我类似于
-108100
的信息,相反,它输出的是
16675416
负数通常表示为补数。所以当负数被编码为十六进制时,这个数被表示为补码,这个值被编码。啊,我明白了。有没有简单的C#转换返回负值?十六进制表示法有多少个字符长?它必须是一个固定的数字,我假定它是一个较长的字符串,我将其拆分以提供所需的值。例如,
FE7258
的输入应该给我类似于
-108100
的信息,相反,它输出的是
16675416
负数通常表示为补数。所以当负数被编码为十六进制时,这个数被表示为补码,这个值被编码。啊,我明白了。有没有简单的C#转换回到负值?好的,谢谢!如何从十六进制数据中获取负值?只需反转操作,x=~(x-1);但是,我不知道您如何知道何时执行此操作,因为需要对值何时被解释为负值进行一些标记。OP的示例值似乎有6个字符(3个字节)长。初始字符串到int的转换可能需要一些填充。@anti:例如,
未选中{Int16 x=(Int16)0xFF85;…}
-给定
0xFF85
我希望得到
Int16
(有符号的2字节值)。@anti:请注意,您似乎有3字节整数(在我的回答中,我使用2字节整数)
FE7258
==
-101800
好的,谢谢!如何从十六进制数据中获取负值?只需反转操作,x=~(x-1);但是,我不知道您如何知道何时执行此操作,因为需要对值何时被解释为负值进行一些标记。OP的示例值似乎有6个字符(3个字节)长。初始字符串到int的转换可能需要一些填充。@anti:例如,
未选中{Int16 x=(Int16)0xFF85;…}
-给定
0xFF85
我希望得到
Int16
(有符号的2字节值)。@anti:请注意,您似乎有3字节整数(在我的回答中,我使用2字节整数)
FE7258
=
-101800
谢谢你的帮助。@anti,np,我想我们大多数人这样做是为了好玩:)谢谢你的帮助。@anti,np,我想我们大多数人这样做是为了好玩:)