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
转换回时,有两个选项:
- 将
视为2字节有符号值(您将得到FF85
返回)-123
- 将
视为4字节有符号值或2字节无符号值(您将得到FF85
)65413
-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
转换回时,有两个选项:
- 将
视为2字节有符号值(您将得到FF85
返回)-123
- 将
视为4字节有符号值或2字节无符号值(您将得到FF85
)65413
如果使用非标准字节大小,例如三个字节作为问题帖子,则可以使用简单减法执行转换:
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,我想我们大多数人这样做是为了好玩:)