【问题标题】:Converting float to hex format将浮点数转换为十六进制格式
【发布时间】:2017-02-23 08:00:16
【问题描述】:

给定以下变量:

float myFloat = 0xC0451EB8;

如何从 myFloat 获取 C0451EB8?

编辑:不知道为什么我在这里被否决而没有评论。我不是在问浮点数或 uint32 的简单十六进制表示。我可以做这个。鉴于上面的变量定义和[可能的常见]答案:

string FloatAsHex(float myFloat) {
  return BitConverter.ToString(BitConverter.GetBytes(myFloat));
}

FloatToHex(0xC0451EB8); //will output 1F-45-40-4F, not what I expect
FloatToHex(BitConverter.ToSingle(BitConverter.GetBytes(0xC0451EB8))) //works

虽然第二个显然有效,但我只能访问 float 变量。

【问题讨论】:

  • 你的意思是字符串?
  • 是的,作为字符串或字节[] - 我只是想反转转换。
  • 您可以尝试使用 .ToString("x") 但这可能需要强制转换为 double 或 int
  • 对于不正确的重复目标,我深表歉意。你的问题实际上是这个问题的重复:stackoverflow.com/questions/74148/…。但是,给定一个具有该值的float,您不能真正做您想做的事情,因为一旦您将0xC0451EB8 存储到float 变量中,您就会失去精度。你可以((uint)myFloat).ToString("X"),它会得到你"C0451F00",这是你将要得到的最接近的。
  • @PeterDuniho 谢谢你,我有一种感觉,我使用了一个不安全的值并且失去了精确度,但我在转换时把头发扯掉了。我以为我已经阅读了 SO 上所有可能的浮点到十六进制转换主题,但我想我忽略了这一主题。

标签: c# hex


【解决方案1】:

没有办法完成您的要求。您的代码将整数值0xC0451EB8 或十进制值3225755320 存储在float 类型的变量中。整数值具有 32 位精度,但 float 不能表示 32 位数字精度,因为 float 值的 32 位中的一些被提交给指数。

因此,整数值 3225755320 被截断为 3225755392

您可以将float 转换回uint,然后使用标准机制格式化为十六进制字符串值。例如。 ((uint)myFloat).ToString("X")。但是,当您这样做时,您将从截断值开始,输出将为 "C0451F00"(或 "0xC0451F00",如果您在格式字符串中包含标准十六进制说明符前缀)。

一旦你截断了原始值,就无法恢复它。你不能逆转这个过程。

【讨论】:

  • 谢谢彼得,不出所料,我什至没有尝试简单地转换为无符号整数然后得到一个格式化的字符串。这暂时有效。也感谢您的详细解释,非常感谢。
【解决方案2】:

文档说使用BitConverter.ToString Method (Byte[]) on msdn

这将返回以十六进制为基数的数字的字符串表示形式。 示例(用于表示数字的字节数组):

00-01-02-04-08-10-20-40-80-FF

【讨论】:

  • 对不起,这不起作用。这将输出 1F-40-45-1F,我希望它输出 B8-1E-45-C0
猜你喜欢
  • 2014-03-01
  • 2010-12-08
  • 2017-01-20
  • 1970-01-01
  • 2016-06-02
  • 1970-01-01
  • 2016-06-01
  • 2020-07-28
相关资源
最近更新 更多